To proste pytanie dotyczące wyrażeń regularnych, ale nie znajduję odpowiedzi.
Chcę ustalić, czy liczba pojawia się w sekwencji dokładnie dwa lub cztery razy. Jakiej składni mogę użyć?
\d{what goes here?}
Próbowałem \d{2,4}
, ale to wyrażenie akceptuje również trzy cyfry.
abc 123 xyz
? Czy powinien pasować,12
ponieważ to dokładnie dwie cyfry w kolejności? A może nie, ponieważ12
jest częścią większej sekwencji cyfr,123
która sama w sobie nie ma ani 2, ani 4 długości? Gdybym miał zgadywać, pomyślałbym, że chcesz tego drugiego zachowania, ale nie wynika to jasno z twojego pytania. Pomocne byłyby przykłady i / lub jaśniejsza specyfikacja. To samo pytanie doabc 12345 def
... co powinno się tam stać?Odpowiedzi:
Nie ma określonej składni, ale można to zrobić na wiele sposobów:
(?:\d{4}|\d{2}) <-- alternation: four digits or two \d{2}(?:\d{2})? <-- two digits, and optionally two more (?:\d{2}){1,2} <-- two digits, times one or two
źródło
\d{2}(?:\d{2})?
rozwiązaniu od razu - niezła różnorodność tych - w szczególności ostatnie, które wydaje się bardzo ładne i skalowalne.(?:
tego, rozpoczyna „grupę nieprzechwytującą” (grupę, do której nie należy odwoływać się w instrukcji zamiany). Możesz też po prostu użyć parenów, ale utworzą one grupę przechwytywania. Więcej szczegółów tutaj: stackoverflow.com/questions/3512471/non-capturing-group"333"
. Możliwe, że przez pomyłkę używasz funkcji „znajdź pasujący podciąg” z biblioteki wyrażeń regularnych zamiast funkcji „sprawdź, czy cały ciąg pasuje”. Powinieneś zapoznać się z jego dokumentacją.(?<!\d)(\d{2}|\d{4})(?!\d)
To jest właściwy sposób, aby to zrobić. Przyjęta odpowiedź jest błędna.
Dopasowałoby 3 cyfry (lub 5). Więc to jest złe w moich oczach .
1) Sprawdź, czy nie ma cyfry przed sekwencją 2 lub 4 cyfr lub po sekwencji dwóch lub czterech cyfr.
(<!)
składnia jest ujemna lookbehind(?!)
składnia jest ujemnym wyprzedzeniem.Powyższe działałoby dla środkowego ciągu:
Jeśli wyszukiwanie ciąg nie ma treści wokół niego można używać
^
i$
rozpocząć i zakończyć kotew strunowych:^\d{4}$|^\d{2}$
źródło
(?<!\d)(\d{2}|\d{4})(?!\d)
^\d{4}$|^\d{2}$
byłby potencjalnym sposobem rozwiązania tego problemu. Jakby^\d{2}(?!\d)|^\d{4}(?!\d)