Które postacie wymagają wyrażenia regularnego?


23

Zasadniczo, które znaki w wyrażeniu regularnym wymagają ucieczki?

Na przykład następujące informacje nie są poprawne pod względem składniowym:

echo '[]' | grep '[]'
grep: Unmatched [ or [^

To jednak jest syntatically poprawne:

echo '[]' | grep '\[]'
[]

Czy istnieje dokumentacja, na których znakach należy wstawiać znaki regularne, a które nie?

Odpowiedzi:


12

To zależy od zastosowania. W twoim przykładzie [należy podać jako argument za, grepale nie echo.

W przypadku powłoki (ze specyfikacji POSIX ):

Cytowanie służy do usuwania specjalnego znaczenia niektórych znaków lub słów z powłoki. Cudzysłowy może służyć do zachowania dosłownego znaczenia znaków specjalnych w następnym akapicie, zapobiegania rozpoznawaniu słów zastrzeżonych jako takich oraz zapobiegania rozszerzaniu parametrów i zastępowaniu poleceń w przetwarzaniu dokumentu tutaj (patrz dokument tutaj).

Wniosek powinien zawierać następujące znaki, jeśli mają się reprezentować:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

i w pewnych okolicznościach może być konieczne podanie następujących informacji. Oznacza to, że te postacie mogą być specjalne w zależności od warunków opisanych w innym miejscu w tym tomie IEEE Std 1003.1-2001:

*   ?   [   #   ˜   =   %

Różne mechanizmy cytowania to znak zmiany znaczenia, pojedyncze cudzysłowy i podwójne cudzysłowy. Dokument tutaj reprezentuje inną formę cytowania; patrz dokument tutaj.

Określone programy (wykorzystujące wyrażenia regularne, perl, awk) mogą mieć dodatkowe wymagania dotyczące zmiany znaczenia.


8

Każda aplikacja będzie miała swój własny zestaw „znaków specjalnych”. Problem, na który natrafiłeś, grepnie dotyczył powłoki. Dla których znaków należy zacytować grep, przeczytaj sekcję strony podręcznika „REGULARNE WYRAŻENIA”.

W przypadku powłoki następujące znaki, które należy zacytować, to:

;'"`#$&*?[]<>{}\

i dowolne białe znaki.

W zależności od powłoki inne znaki mogą wymagać cytowania:

!^%

Zajrzyj pod „SHELL GRAMMAR” na stronie podręcznej pocisku.


W niektórych powłokach z rozszerzeniem historii (w bashzestawie) !nadal jest rozwijany w podwójnych cudzysłowach, tylko pojedyncze cudzysłowy zatrzymają jego rozwinięcie (lub wyłączenie opcji powłoki).
Chris Down,

]nie należy cytować, [nie zawsze. Nie mogę znaleźć żadnego odniesienia do {i}
Matteo

8

Istnieje wiele rodzajów wyrażeń regularnych, a zestaw znaków specjalnych zależy od konkretnego typu. Niektóre z nich opisano poniżej. We wszystkich przypadkach znaki specjalne są poprzedzane odwrotnym ukośnikiem \. Np. Aby dopasować [, napisz \[zamiast tego. Alternatywnie znaki (z wyjątkiem ^) można uciec, zamykając je między nawiasami kwadratowymi jeden po drugim, podobnie [[].

Znaki, które są specjalne w niektórych kontekstach, takie jak ^specjalne na początku (pod-) wyrażenia, mogą być poprzedzane znakami ucieczki we wszystkich kontekstach.

Jak napisali inni: w powłoce, jeśli nie umieścisz wyrażenia między pojedynczymi cudzysłowami, musisz dodatkowo uciec od znaków specjalnych dla powłoki w już zmienionym wyrażeniu regularnym. Przykład: Zamiast tego '\['możesz pisać \\[(alternatywnie: "\["lub "\\[") w kompatybilnych powłokach Bourne'a, takich jak bash, ale to już inna historia.

Podstawowe wyrażenia regularne (BRE)

  • POSIX: Podstawowe wyrażenia regularne
  • Polecenia: grep,sed
  • Znaki specjalne: .[\
  • Specjalny w niektórych kontekstach: *^$
  • Escape a string: "$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

Rozszerzone wyrażenia regularne (ERE)

  • POSIX: Rozszerzone wyrażenia regularne
  • Polecenia:, grep -EGNU sed -r:, * BSD:sed -E
  • Znaki specjalne: .[\(
  • Specjalny w niektórych kontekstach: *^$)+?{|
  • Escape a string: "$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"

3

grepużywa BRE jako metody wyrażenia regularnego. Jest dobra dokumentacja na nim tutaj , ogólne wybiegiem byłoby „uciec dowolny znak specjalny lub metaznaku uzyskać dosłownym, ucieczka tworzyć sekwencje ( \n, \ritp)”, choć nie zawsze jest to prawda, na przykład, trzeba uciec (i )uzyskać ich specjalne znaczenie (odniesienie wsteczne).


0

Powłoka może przekształcić wiersz poleceń przed wykonaniem polecenia. Zarówno powłoka, jak i grepmoże używać cudzysłowu, aby usunąć specjalne znaczenie niektórych znaków. Niemniej jednak greppociski mają różne znaki specjalne. Co więcej, znaki specjalne nieskalowane, które nie powstały z istniejącego rozszerzenia, są usuwane przed wykonaniem polecenia przez powłokę.

echo '[]' | grep '[]'

Powłoka przesyła argument []do grepi jest analizowana jako zniekształcone wyrażenie nawiasowe przez grep.

echo '[]' | grep \[]

Powyżej widzimy podobny przypadek. Odwrotny ukośnik jest usuwany i []przesyłany jako argument do grep. greprozpoznaje zniekształcone wyrażenie w nawiasie.

echo '[]' | grep '\[]'

Wreszcie w tym przypadku cudzysłowy są usuwane przez powłokę i \[]przekazywane jako argument do, grepale w tym konkretnym przypadku ¹ \[jest interpretowane grepjako dosłowny nawias. Aby zapobiec interpretacji ukośnika odwrotnego jako powłoki specjalnej, potrzebne są cudzysłowy.


¹ Specyfikacja POSIX .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.