Zmiana znaczenia znaku ukośnika w przód w wyrażeniu regularnym


106

Moje pytanie jest proste i dotyczy ucieczki wyrażenia regularnego. Czy musisz unikać ukośnika /w wyrażeniu regularnym? A jak byś to zrobił?


1
Jakiego języka / implementacji wyrażeń regularnych używasz?
— Gumbo

Co ciekawe, szukałem tego pytania dla Javascript. Ale wtedy moje IDE powiedziało, że używam niepotrzebnej ucieczki. Tak myStr.replace(/[/:.-]+/gi, '_')jest, ku mojemu zaskoczeniu. Myślałem, że będę potrzebować /[\/:.-]+/gi. Nie mogę się zdecydować, czy to fajne czy zagmatwane.
— Turbo

Odpowiedzi:


90

Jaki kontekst / język? Niektóre języki używają /jako separatora wzorca, więc tak, musisz go uciec, w zależności od języka / kontekstu. Uciekasz przed nim, umieszczając przed nim ukośnik w tył: w \/przypadku niektórych języków (takich jak PHP) możesz użyć innych znaków jako separatora i dlatego nie musisz go uciekać. Ale AFAIK we wszystkich językach, jedyne szczególne znaczenie, jakie /ma to to, że może to być wyznaczony ogranicznik wzoru.


38

Oto kilka opcji:

  • W Perlu możesz wybrać alternatywne ograniczniki. Nie jesteś ograniczony m//. Możesz wybrać inny, taki jak m{}. Wtedy ucieczka nie jest konieczna. Prawdę mówiąc, Damian Conway w „Perl Best Practices” zapewnia, że m{}jest to jedyny alternatywny separator, który powinien być używany, i jest to wzmocnione przez Perl :: Critic (na CPAN). Chociaż możesz uciec przy użyciu różnych alternatywnych znaków ograniczających //i {}wydaje się, że są one najbardziej przejrzyste do rozszyfrowania później. Jeśli jednak którykolwiek z tych wyborów powoduje zbyt dużą ucieczkę, wybierz tę, która najlepiej nadaje się do czytelności. Typowymi przykładami są m(...), m[...]i m!...!.

  • W przypadkach, gdy nie możesz lub wolisz nie używać alternatywnych separatorów, możesz pominąć ukośniki w przód za pomocą ukośnika odwrotnego: m/\/[^/]+$/na przykład (używając alternatywnego separatora, który mógłby się stać m{/[^/]+$}, który może być czytelniejszy). Unikanie ukośnika za pomocą odwrotnego ukośnika jest na tyle powszechne, że zdobył imię i stronę Wikipedii: Syndrom krzywej wykałaczki . W wyrażeniach regularnych, w których jest tylko jedno wystąpienie, uniknięcie ukośnika może nie wzrosnąć do poziomu bycia uważanym za przeszkodę w czytelności, ale jeśli zacznie wymykać się spod kontroli i jeśli Twój język dopuszcza alternatywne separatory, tak jak robi to Perl, być preferowanym rozwiązaniem.


1
Czy możesz podać przykład? Mam to: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confI dostaję konflikty z ukośnikami.
— CMCDragonkai

Zwróć uwagę, że używasz znaku s, a nie an m, kiedy wykonujesz zamianę (aka podstawienie) z wyrażeniami regularnymi. perlfect.com/articles/regex.shtml
— Mashmagar

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... ale to jest prawdopodobnie lepsze: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confponieważ unika interpolacji powłoki.
— DavidO

1
Alternatywą dla zmiany znaczenia /znaku literału jest użycie funkcji regex polegającej na określaniu znaku za pomocą jego kodowania ASCII, szesnastkowo lub ósemkowo. Perl akceptuje formę \57
— ósemkową

Na stronie, do której prowadzi lukeuser (dziękuję), znajduje się również sekwencja ucieczki \ Q ... \ E. To zadziałało dla mnie.
— user3012857

11

Użyj ukośnika odwrotnego \lub wybierz inny separator, np. m#.\d#Zamiast /.\d/ "W Perlu, możesz zmienić / separator wyrażenia regularnego na prawie każdy inny znak specjalny, jeśli poprzedzisz go literą m (w celu dopasowania);"




0

W przypadku javy nie musisz.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

Jeśli umieścisz \ przed /. IDE powie Ci „Redundant Character Escape” \ / „in ReGex”

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.