Pytanie Regex, jak dopasować opcjonalny znak


Mam wyrażeń regularnych, które do tej pory działały poprawnie. Muszę dopasować opcjonalny znak. Może tam być, albo nie.

Oto dwa ciągi. Górny ciąg jest dopasowywany, a niższy nie. Brak pojedynczej litery w niższym łańcuchu powoduje niepowodzenie.

Chciałbym otrzymać pojedynczą literę po 5 początkowych cyfrach, jeśli jest, a jeśli nie, kontynuuj pobieranie pozostałej części łańcucha. Ten list może być A-Z.

Jeśli usunę ([A-Z]{1}) +.*? + z regex dopasuje wszystko, czego potrzebuję, oprócz litery, ale jest to trochę ważne.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Oto wyrażeń regularnych, których używam.

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

76
2017-10-24 06:34


pochodzenie




Odpowiedzi:


Posługiwać się

[A-Z]?

aby uczynić ten list opcjonalnym. {1} jest zbędny. (Oczywiście możesz też napisać [A-Z]{0,1} co oznaczałoby to samo, ale tak właśnie jest ? jest tam.)

Możesz poprawić swoje wyrażenie regularne

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

A ponieważ w większości dialektów regex, \d jest taki sam jak [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

Ale: czy naprawdę potrzebujesz 11 oddzielnych grup przechwytujących? A jeśli tak, to dlaczego nie przechwycisz czwartej do ostatniej grupy cyfr?


142
2017-10-24 06:44



Tim, szczerze mówiąc nie jestem pewien, ponieważ nie napisałem tego wyrażenia regularnego. Wciąż jestem całkiem nowy, by wyrecytować. Jeśli widzisz lepszy sposób pisania tego, jestem otwarty na sugestie. - jim
Tim, twój przykład działa dla obu łańcuchów, czy mam literę na tej pozycji, czy nie. Dzięki. - jim


Możesz uczynić pojedynczą literę opcjonalną, dodając a ? po nim jako:

([A-Z]{1}?)

Kwantyfikator {1} jest zbędny, więc możesz go upuścić.


13
2017-10-24 06:42



Dzięki codeaddict. Czy znak zapytania zastępuje znak "+. *? + `? - jim
Używając polecenia grep wyrażenie regularne otrzymasz błąd, jeśli upuścisz {1} (grep: lookbehind asercja nie ma stałej długości). A więc jest to uzasadnione tym, żeby go zostawić. - Zunderscore


Musisz zaznaczyć także jedną literę jako opcjonalną:

([A-Z]{1})? +.*? +

lub uczynić całą część opcjonalną

(([A-Z]{1}) +.*? +)?

4
2017-10-24 06:44



Stefan, chciałbym, aby list był całkowicie opcjonalny. Próbowałem obu, ale wciąż nic nie pasuje. Jestem pewien, że źle to zrozumiałem. Czy mógłbyś zmodyfikować swój przykład, aby uwzględnić go w ciągu znaków? - jim