Aby dokładnie wiedzieć, kiedy i co uciec bez prób, konieczne jest dokładne zrozumienie łańcucha kontekstów, przez które przechodzi ciąg. Określisz ciąg od najdalszej strony do jego końcowego miejsca docelowego, którym jest pamięć obsługiwana przez kod parsujący wyrażenia regularnego.
Pamiętaj, jak przetwarzany jest ciąg znaków w pamięci: jeśli może to być zwykły ciąg znaków w kodzie lub ciąg znaków wprowadzony do wiersza poleceń, ale może to być interaktywny wiersz poleceń lub wiersz poleceń podany w pliku skryptu powłoki lub wewnątrz zmiennej w pamięci wymienionej w kodzie lub argumentu (ciągu znaków) w wyniku dalszej oceny lub ciągu zawierającego kod generowany dynamicznie przy użyciu dowolnego rodzaju enkapsulacji ...
Każdemu z tych kontekstów przypisano niektóre znaki o specjalnej funkcjonalności.
Jeśli chcesz przekazać znak dosłownie bez użycia jego specjalnej funkcji (lokalnej dla kontekstu), to jest to przypadek, w którym musisz go uciec, dla następnego kontekstu ... który może wymagać kilku innych znaków zmiany znaczenia, które mogą dodatkowo wymagać uciekł w poprzednich kontekstach. Ponadto mogą istnieć rzeczy takie jak kodowanie znaków (najbardziej podstępny jest utf-8, ponieważ wygląda jak ASCII dla zwykłych znaków, ale może być opcjonalnie interpretowany nawet przez terminal w zależności od jego ustawień, aby mógł zachowywać się inaczej, niż atrybut kodowania HTML / XML, konieczne jest dokładne zrozumienie procesu.
Np. Wyrażenie regularne w linii poleceń zaczynające się od perl -npe
, musi zostać przesłane do zestawu exec wywołań systemowych łączących się jako potok obsługi plików, każde z tych wywołań systemowych exec ma tylko listę argumentów oddzielonych spacjami (bez znaków zmiany znaczenia), i ewentualnie potoki (|) i przekierowanie (> N> N> i M), nawiasy, interaktywna rozbudowa *
i?
,$(())
... (wszystkie są znakami specjalnymi używanymi przez * sh, które mogą wydawać się zakłócać charakter wyrażenia regularnego w następnym kontekście, ale są one oceniane w kolejności: przed wierszem poleceń. Wiersz poleceń jest odczytywany przez program jako bash / sh / csh / tcsh / zsh, zasadniczo wewnątrz podwójnego cudzysłowu lub pojedynczego cudzysłowu ucieczka jest prostsza, ale nie jest konieczne cytowanie ciągu w wierszu poleceń, ponieważ w większości miejsca należy poprzedzić ukośnikiem odwrotnym, a cytat to nie jest konieczne pozostawienie dostępnej funkcji rozwijania dla znaków * i?, ale parsowanie odbywa się w innym kontekście niż w cudzysłowie. Następnie, gdy linia poleceń jest oceniana, wyrażenie regularne uzyskane w pamięci (nie tak jak napisano w linii poleceń) jest traktowane tak samo jak byłby w pliku źródłowym. Dla wyrażenia regularnego istnieje kontekst zestawu znaków w nawiasach kwadratowych [],wyrażenie regularne perl może być cytowane przez duży zestaw znaków niealfanumerycznych (np. m // lub m: / better / for / path: ...).
Masz inne szczegóły na temat znaków w innej odpowiedzi, które są bardzo specyficzne dla końcowego kontekstu wyrażenia regularnego. Jak już wspomniałem, wspomniałeś, że podczas prób odnajdujesz ucieczkę wyrażenia regularnego, prawdopodobnie dlatego, że inny kontekst ma inny zestaw znaków, który mylił twoją pamięć prób (często odwrotny ukośnik to znak używany w tym innym kontekście do ucieczki od literalnego znaku zamiast jego funkcji ).
escape()
”, aby umożliwić stosowanie dowolnych ciągów jako części wyrażeń regularnych.