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.
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.
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);"
myStr.replace(/[/:.-]+/gi, '_')
jest, ku mojemu zaskoczeniu. Myślałem, że będę potrzebować/[\/:.-]+/gi
. Nie mogę się zdecydować, czy to fajne czy zagmatwane.Odpowiedzi:
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.źródło
Oto kilka opcji:
W Perlu możesz wybrać alternatywne ograniczniki. Nie jesteś ograniczony
m//
. Możesz wybrać inny, taki jakm{}
. Wtedy ucieczka nie jest konieczna. Prawdę mówiąc, Damian Conway w „Perl Best Practices” zapewnia, żem{}
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[...]
im!...!
.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.źródło
perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf
I dostaję konflikty z ukośnikami.s
, a nie anm
, kiedy wykonujesz zamianę (aka podstawienie) z wyrażeniami regularnymi. perlfect.com/articles/regex.shtmlperl -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.conf
ponieważ unika interpolacji powłoki./
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
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);"źródło
Jeśli separatorem jest /, będziesz musiał uciec.
źródło
Jeśli używasz języka C #, nie musisz go uciekać.
źródło
W przypadku javy nie musisz.
Jeśli umieścisz \ przed /. IDE powie Ci „Redundant Character Escape” \ / „in ReGex”
źródło