Mam listę ciągów. Niektóre z nich mają formę 123-...456
. Część zmienna „...” może być:
- ciąg „jabłko”, po którym następuje myślnik, np
123-apple-456
- ciąg „banan”, po którym następuje myślnik, np
123-banana-456
- pusty ciąg znaków, np.
123-456
(pamiętaj, że jest tylko jeden łącznik)
Każde słowo inne niż „jabłko” lub „banan” jest nieprawidłowe.
W tych trzech przypadkach chciałbym dopasować odpowiednio „jabłko”, „banan” i „”. Pamiętaj, że nigdy nie chcę przechwytywać łącznika, ale zawsze chcę go dopasować . Jeśli ciąg nie ma takiej postaci, 123-...456
jak opisano powyżej, to w ogóle nie ma zgodności.
Jak napisać wyrażenie regularne, aby to zrobić? Załóżmy, że mam smak, który pozwala grupom patrzeć naprzód, patrzeć za siebie, patrzeć i nie przechwytywać.
Kluczową obserwacją jest to, że gdy masz „jabłko” lub „banan”, musisz także mieć łącznik końcowy, ale nie chcesz go dopasowywać. A kiedy jesteś dopasowanie pusty ciąg, to nie muszą mieć łącznik z tyłu. Myślę, że wyrażenie regularne, które zawiera to twierdzenie, będzie właściwe.
Odpowiedzi:
Jedynym sposobem, aby czegoś nie uchwycić, jest zastosowanie rozeznania :
Ponieważ nawet w przypadku grup nie przechwytujących
(?:…)
całe wyrażenie regularne przechwytuje ich dopasowaną treść. Ale to wyrażenie regularne dopasowuje tylkoapple
lubbanana
jeśli jest poprzedzony123-
oraz zakończony-456
, albo dopasowuje pusty łańcuch, jeśli jest poprzedzony123-
oraz zakończony456
.źródło
Aktualizacja: Dzięki Germán Rodríguez Herrera!
W javascript spróbuj:
/123-(apple(?=-)|banana(?=-)|(?!-))-?456/
Pamiętaj, że wynik znajduje się w grupie 1
Demo Debuggex
źródło
Próbować:
To będzie pasować
apple
,banana
lub pusty ciąg, a po nim pojawią się łączniki 0 lub 1. Myliłem się, nie potrzebując grupy przechwytującej. Głupi ja.źródło
Zmodyfikowałem jedną z odpowiedzi (autor: @ op1ekun):
Powodem jest to, że odpowiedź z @ op1ekun również pasuje
"123-apple456"
, bez łącznika po jabłku.źródło
Spróbuj tego:
źródło
apple
lubbanana
lub „”. Wszystkie inne wartości są nieprawidłowe, jak już powiedziałem.Odmiana wyrażenia @Gumbo, która wykorzystuje
\K
do resetowania pozycji dopasowania, aby zapobiec włączeniu bloków liczbowych do dopasowania. Można go używać w smakach regularnych PCRE.Mecze:
źródło
Zdecydowanie najprostszy (działa dla Pythona) jest
'123-(apple|banana)-?456'
.źródło
123-apple456
więc nie jest poprawne.