2010-10-24 14 views
56

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

Oto dwa ciągi. Górny ciąg jest dopasowywany, a niższy nie. Brak pojedynczej litery w dolnym ciągu jest przyczyną niepowodzenia.

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

Jeśli usuniemy ([A-Z]{1}) +.*? + z wyrażenia regularnego, będzie pasować do wszystkiego, czego potrzebuję oprócz litery, ale jest to 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})/ 

Odpowiedz

112

Zastosowanie

[A-Z]? 

aby list opcjonalne. {1} jest zbędny. (Oczywiście można też napisać [A-Z]{0,1} co oznaczałoby to samo, ale to, co ? jest tam.)

Można by poprawić swój regex

^([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 regex dialektów, \d jest taka sama 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 oddzielne grupy Chwytając? A jeśli tak, to dlaczego nie przechwycisz czwartej do ostatniej grupy cyfr?

+0

Tim, szczerze mówiąc nie jestem pewien, ponieważ nie napisałem tego wyrażenia. Wciąż jestem całkiem nowy, by wyrecytować. Jeśli widzisz lepszy sposób pisania tego, jestem otwarty na sugestie. – jim

+0

Tim, twój przykład działa dla obu łańcuchów, czy mam literę na tej pozycji, czy nie. Dzięki. – jim

13

Można zrobić pojedyncza litera opcjonalnie dodając ? po niej, jak:

([A-Z]{1}?) 

kwantyfikatora {1} jest zbędne, dzięki czemu można go upuścić.

+0

Dzięki codeaddict. Czy znak zapytania zastępuje znak "+. *? + '? – jim

+0

Używając polecenia grep wyrażenie regularne otrzymasz błąd, jeśli upuścisz {1} (grep: lookbehind asercja nie ma ustalonej długości). A więc to jest sprawa, żeby to zostawić. – Zunderscore

3

Trzeba zaznaczyć pojedynczą literę jako opcja też:

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

lub sprawić, że cała część opcjonalnego

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

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

Powiązane problemy