2014-05-14 7 views
5

Uczę się wyrażeń regularnych. Mam pewne wątpliwości dotyczące tego przykładu:`{n}` meta po iteracji po klasie posix w regex

Chciałbym znaleźć wszystkie pliki z konwencjonalnymi rozszerzeniami w nazwach. To działa:

ls | grep '\.[[:lower:]][[:lower:]][[:lower:]]$' 

ale to nie:

ls | grep '\.[[:lower:]]{3}$' 

O ile dobrze zrozumiałem {n} iteracja wyniki znaków meta w pasujące do wzorca, który ma dokładnie {n} wystąpień poprzedzającego znaku. Czy to nie działa z klasami POSIX? Czy robię tutaj jakiś głupi błąd?

Odpowiedz

5

W POSIX basic (BRE), trzeba uciec szelki dla tej pracy:

ls | grep '\.[[:lower:]]\{3\}$' 

W POSIX Extended (ERE), wymóg ten został odrzucony, a ERE też wreszcie dodaje naprzemienne (|) do wyrażeń regularnych (chociaż niektóre narzędzia korzystające z BRE obsługują naprzemienną zmianę poprzez \|).

+0

Dlaczego potrzebujemy podwójnych nawiasów kwadratowych? – thefourtheye

+0

@ thefourtheye Ponieważ tak działają nazwane klasy znaków w POSIX. –

+0

Dziękuję za wyjaśnienie. –

Powiązane problemy