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?
źródło
grep
,sed
iawk
. Vim używa własnej odmiany, podobnie jak Perl.*
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.Odpowiedzi:
Jak lk- powiedział opcja będzie traktować jako argument glob, a nie wyrażenie regularne.
-name
find
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]ata
moż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 .
źródło
[Rr]eading[Tt]est[Dd]ata
wydaje się obowiązywać zarówno jako glob, jak i wyrażenie regularne, i uważam, że ma to samo „znaczenie” w obu interpretacjach. Jednak-name
opcjafind
potraktuje 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.źródło