Czym różnią się wyrażenia regularne od symboli wieloznacznych używanych do filtrowania plików

15

Chociaż używamy *do oznaczenia zero lub więcej poprzednich znaków grep, używamy *.cdo znajdowania wszystkich plików C, gdy używamy go z lspoleceniem podobnym ls *.c. Czy ktoś mógłby powiedzieć, w jaki sposób użycie *różni się w tych dwóch przypadkach?

użytkownik3539
źródło

Odpowiedzi:

30

Globbing nazw plików powłoki i wyrażenia regularne używają tych samych znaków i mają one podobne cele, ale masz rację, nie są kompatybilne. Globowanie nazw plików jest znacznie mniej wydajnym systemem.

Globbing nazw plików:

  • * oznacza „zero lub więcej znaków”

  • ? oznacza „dowolny pojedynczy znak”

Ale w wyrażeniach regularnych musisz używać .*„zero lub więcej znaków” i .„dowolny pojedynczy znak”. A ?oznacza coś zupełnie odmiennego w wyrażeniach regularnych: zero lub jedno wystąpienie poprzedniego elementu RE.

Nawiasy kwadratowe ( []) wydają się działać tak samo w obu systemach w systemie, na którym piszę, przynajmniej dla prostych przypadków. Dotyczy to między innymi klas znaków POSIX (np [:alpha:].). To powiedziawszy, jeśli potrzebujesz, aby twoje polecenia działały na wielu różnych typach systemów, odradzam używanie czegokolwiek poza podstawowymi rzeczami, takimi jak listy znaków (np. [abeq]) I może zakresy znaków (np [a-c].).

Różnice te oznaczają, że oba systemy można bezpośrednio zamieniać tylko w prostych przypadkach. Jeśli potrzebujesz wyrażenia regularnego nazw plików, musisz to zrobić w inny sposób. find -regexjest jedną z opcji. (Zwróćmy uwagę, że istnieje także find -namesposób, w jaki używa się składni glob.)

Warren Young
źródło
2
Nie wiem, czy to się nazywa globbing :)
użytkownik3539,
3
Ponadto istnieją różne smaki wyrażeń regularnych. Nie wszystkie wyrażenia regularne są tworzone tak samo! I masz wiele innych sposobów dopasowywania wzorca, takich jak SQL , takich jak , gdzie '%'środki '*'.
Pan Lister,
4
Dwa główne smaki wyrażeń regularnych to POSIX i PCRE (RE zgodny z Perl). Później jest mniej skomplikowany i ma więcej funkcji. Narzędzia i powłoki uniksowe zazwyczaj używają POSIX, większość języków programowania z wbudowanymi wyrażeniami regularnymi (oprócz powłoki) używa PCRE. Uważaj tylko na różnicę podczas czytania materiałów online.
goldilocks,
11

Odpowiedź na pytanie wyrażone w oryginalnym tytule:

Dlaczego wyrażenia regularne różnią się od tych używanych do filtrowania plików?

Rozszerzenie nazwy pliku poprzedza wyrażenia regularne, które istniały już w większości systemów operacyjnych (znaki wieloznaczne / joker) i jest znacznie prostsze i intuicyjne niż ten drugi.

Choć *.txtjest łatwy do zrozumienia dla zwykłych użytkowników, analogia .*\.txtjest czymś bardziej ukierunkowanym na doświadczonych użytkowników / programistów, nie wspominając o ^.*\.txt$...

jlliagre
źródło
2
Kolejny powód części „dlaczego”: prędkość. Wyrażenia regularne są wolniejsze: pastebin.com/3iNCgkE3
manatwork
3
*.txtnie jest równy .*\.txt, to (głównie) jest równy, .*\.txt$ponieważ po .txt(przynajmniej przy rozsądnym globowaniu nazw plików) nie może być niczego . Być może nawet ^.*\.txt$nieco w zależności od użycia. Udowadnia swój punkt widzenia?
CVn