Jaka jest definicja wyrażenia regularnego?

10

Niedawno wdałem się w przyjacielską kłótnię z Ghoti na temat tego, co stanowi regularne wyrażenie w komentarzach do mojej odpowiedzi na to pytanie. Twierdziłem, że następujące wyrażenie jest wyrażeniem regularnym:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti się nie zgodził, twierdząc, że jest to glob pliku. Strona globalna na Wikipedii twierdzi, że (moje wyróżnienie):

Globs nie zawierają składni dla gwiazdy Kleene, która umożliwia wielokrotne powtórzenie poprzedniej części wyrażenia; dlatego nie są uważane za wyrażenia regularne, które mogą opisywać większy zestaw języków regularnych nad dowolnym skończonym alfabetem.

Jednak nie ma cytatu na to twierdzenie, co wskazuje, że jest to tylko opinia konkretnego redaktora Wikipedii.

Single UNIX ® Specyfikacja, wersja 2 , stwierdza, że podstawowe wyrażenie regularne (BRE) może być nawet pojedynczy znak:

Zwykły znak to BRE, który pasuje do siebie: dowolny znak w obsługiwanym zestawie znaków, z wyjątkiem znaków specjalnych BRE wymienionych w Znakach specjalnych BRE.

Jaka jest zatem definicja wyrażenia regularnego w świecie * nix i czy ta definicja wyklucza globusy plików?

terdon
źródło
6
W teoretycznym CS wyrażenie regularne to opis języka regularnego, który może być rozpoznany przez automat skończony. W świecie uniksowym jest to o wiele bardziej skomplikowane i nie ma jednej definicji. Istnieją 2 dialekty regex w specyfikacji POSIX: Rozszerzony i podstawowe, które są wykorzystywane przez narzędzia jak grep, sedi awk. Vim używa własnej odmiany, podobnie jak Perl.
jw013,
Tak więc według tej definicji glob pliku jest BRE, prawda?
terdon
2
Nie, glob pliku nie jest BRE - co sprawia, że ​​tak myślisz? Jeśli przeczytasz opis BREIX POSIX i opis globowania POSIX, zauważysz, że nie są one takie same. Na przykład *ma dwa różne znaczenia w BRE i globach. Uwaga: Nie sądzę, aby termin glob był używany w dowolnym miejscu specyfikacji POSIX - zamiast tego nazywa się Dopasowywanie wzorców i jest opisany w rozdziale dotyczącym języka powłoki.
jw013,
Zobacz także Dlaczego moje wyrażenie regularne działa w X, ale nie w Y?
Gilles „SO- przestań być zły”

Odpowiedzi:

10

Jak lk- powiedział opcja będzie traktować jako argument glob, a nie wyrażenie regularne.-namefind

To, czy ciąg interpretowany jest jako glob, czy wyrażenie regularne, czy tylko zwykły ciąg, zależy od tego, co jest używane do interpretacji. To kwestia kontekstu. Łańcuch w twoim przykładzie [Rr]eading[Tt]est[Dd]atamożna ocenić na wiele różnych sposobów, ale to, co to jest, zależy od tego, jak go używasz. Użyj go jako globu, to glob. Użyj go jako wyrażenia regularnego, to wyrażenie regularne. W przypadku pytania, z którego pochodzi , OP opisał ciąg jako wyrażenie regularne. Dlatego możemy założyć, że planował zinterpretować to jako wyrażenie regularne.

Pojedyncza postać może być również wyrażeniem regularnym, absolutnie. Może to być także ciąg znaków i glob. Jeśli chcesz, może być interpretowany jako bajt lub maleinta. Wszystko zależy od kontekstu.

Istnieje wiele specyfikacji wyrażeń regularnych w różnych formach. BRE i ERE są dobrze udokumentowane. PCRE dodaje nowe funkcjonalności. Wielu tłumaczy regularnych będzie implementowało, na przykład, „cały ERE i część PCRE”. Albo zrobią ERE minus jakaś funkcja. Jeśli używasz specyfikacji formalnych, wiele narzędzi twierdzi, że obsługa wyrażeń regularnych okazuje się być niepoprawna lub niekompletna. Znajomość szczegółów pozwala dostosować swoje rozwiązania do zestawu funkcji dostępnych w ramach dowolnego narzędzia oceniającego wyrażenie regularne.

Więc ... jeśli szukasz definicji, które wykluczają globusy, patrzysz na to z niewłaściwej perspektywy. O tym, jak to określisz, decyduje sposób użycia .

ghoti
źródło
7

[Rr]eading[Tt]est[Dd]atawydaje się obowiązywać zarówno jako glob, jak i wyrażenie regularne, i uważam, że ma to samo „znaczenie” w obu interpretacjach. Jednak -nameopcja findpotraktuje argument jako glob, a nie wyrażenie regularne.

To rozróżnienie będzie miało znaczenie, jeśli podasz argument taki jak foo*, który jest zarówno poprawnym globem, jak i prawidłowym wyrażeniem regularnym, ale ma inne znaczenie w zależności od interpretacji:

Jeżeli interpretowany jako wzorzec glob, to pasuje foo, foobar, foo123, itd.

Jeżeli interpretowany jako wyrażenie regularne, to pasuje fo, foo, foooooo, itd.

Łk
źródło
Dzięki, widzę różnicę między wzorem globu a wyrażeniem regularnym. Jaka jest jednak formalna definicja wyrażenia regularnego?
terdon
1
Nie wiem, czy istnieje jedna definicja „wyrażeń regularnych”, ponieważ termin ten jest powszechnie używany. Istnieją różne specyfikacje składniowe, takie jak wyrażenia regularne POSIX lub wyrażenia regularne Perl, które obejmują inne „funkcje”, takie jak odwołania wsteczne lub uprzedzenia. Nie mogą to być już wyrażenia regularne w najściślejszym znaczeniu (w kontekście regularnych języków formalnych), ale nadal są określane jako takie.
Łk-