Nie możesz uciec od ukośnika odwrotnego za pomocą wyrażenia regularnego?


114

Używam następującego wyrażenia regularnego

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

Wiem, że jest brzydki, ale jak dotąd służy on innym celom niż ukośnik odwrotny nie jest dozwolony tak, jak myślę, że powinien, ponieważ uciekł, próbowałem też \\zamiast, \\\ale te same wyniki. Jakieś pomysły?


4
Właśnie poprawiłem literówkę w tytule, ale jest coś naprawdę niesamowitego w tytule „Nie możesz uciec od luzu za pomocą wyrażenia regularnego?” W rzeczy samej!
Adam Crossland

1
@AdamCrossland Czy nie wszyscy chcielibyśmy, aby regex pomogło nam uciec przed ostrym sprzeciwem? > _>
Eton B.

2
Heck, chciałbym tylko móc uciec od luzu z wyrażenia regularnego.
Adam Crossland

Odpowiedzi:


226

Jeśli umieszczasz to w łańcuchu w programie, być może będziesz musiał użyć czterech odwrotnych ukośników (ponieważ parser łańcuchów usunie dwa z nich podczas "usuwania zmiany znaczenia" dla ciągu) , a następnie wyrażenie regularne potrzebuje dwóch na unikano odwrotnego ukośnika wyrażenia regularnego).

Na przykład:

regex("\\\\")

jest interpretowane jako ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

jest interpretowane jako ...

regex(\\)

jest interpretowane jako wyrażenie regularne, które pasuje do pojedynczego ukośnika odwrotnego.


W zależności od języka możesz użyć innej formy cytowania, która nie analizuje sekwencji ucieczki, aby uniknąć konieczności używania ich tylu - na przykład w Pythonie:

re.compile(r'\\')

rPrzed cytatów sprawia, że surowy ciąg, który nie analizowania ucieczek BACKSLASH.


14
hehe ... Właśnie wpadłem na to i musiałem dodać trzy. Po prostu dodawałem odwrotne ukośniki, aż zadziałało.
billynoah

ummm, dlaczego u licha to wyrażenie regularne jest reinterpretowane dwukrotnie zamiast raz, tak jak powinno być w przypadku PCRE?
Jim Michaels

3
@JimMichaels, ponieważ nie wszystkie języki mają literały wyrażeń regularnych bez znaku zmiany znaczenia, a zatem czasami sam język programowania interpretuje znaki ukośne raz w składni ciągu, a wynikowy ciąg jest następnie przekazywany do silnika wyrażeń regularnych (który interpretuje znaki ukośne w składni wyrażeń regularnych).
Amber

1
kiedyś, dawno temu, musiałem przechwycić ścieżkę xpath elementu, którego jedyną cechą identyfikującą była ścieżka do pliku systemu Windows, a następnie wygenerować program (jako ciąg znaków), w którym ścieżki xpath miały być reprezentowane jako łańcuchy. w pewnym momencie w krokach pośrednich było 8 odwrotnych ukośników używanych do reprezentowania pojedynczego odwrotnego ukośnika w ścieżce pliku. To najwyższy poziom, jaki kiedykolwiek osiągnąłem.
Zackkenyon

Może się to stać jeszcze bardziej skomplikowane podczas wyszukiwania ukośników odwrotnych wraz z wzorami, które wymagają metaznaków. Weźmy na przykład znalezienie ukośnika odwrotnego, po którym następuje cyfra. Teraz chcesz być patrząc na następujące wyrażenie próbuje dowiedzieć się, co się dzieje: new RegExp('\\\\\\d');.
jabacchetta

15

Jeśli nie jest to literał, musisz użyć \\\\, aby uzyskać, \\co oznacza uciekający odwrotny ukośnik.

To dlatego, że istnieją dwie reprezentacje. W łańcuchowej reprezentacji twojego wyrażenia regularnego masz "\\\\", co jest wysyłane do parsera. Parser zobaczy, \\co interpretuje jako prawidłowy odwrócony ukośnik uciekający (który pasuje do pojedynczego odwrotnego ukośnika).


10

Ukośnik odwrotny \to znak zmiany znaczenia w wyrażeniach regularnych. Dlatego podwójny lewy ukośnik rzeczywiście oznaczałby pojedynczy, dosłowny odwrotny ukośnik.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ref: http://www.regular-expressions.info/reference.html


4

Z http://www.regular-expressions.info/charclass.html :

Zauważ, że jedynymi znakami specjalnymi lub metaznakami wewnątrz klasy znaków są nawias zamykający (]), ukośnik odwrotny (\\), daszek (^) i łącznik (-). Zwykłe metaznaki to zwykłe znaki wewnątrz klasy znaków i nie muszą być poprzedzone odwrotnym ukośnikiem. Aby wyszukać gwiazdkę lub plus, użyj [+ *]. Twoje wyrażenie regularne będzie działać dobrze, jeśli unikniesz zwykłych metaznaków w klasie postaci, ale zrobienie tego znacznie zmniejszy czytelność.

Aby dołączyć ukośnik odwrotny jako znak bez żadnego specjalnego znaczenia wewnątrz klasy znaków, należy go ująć innym ukośnikiem odwrotnym. [\\ x] dopasowuje ukośnik odwrotny lub x. Nawias zamykający (]), daszek (^) i łącznik (-) można dodać, poprzedzając je ukośnikiem odwrotnym lub umieszczając je w miejscu, w którym nie nabierają one specjalnego znaczenia. Polecam tę drugą metodę, ponieważ poprawia czytelność. Aby dołączyć daszek, umieść go w dowolnym miejscu oprócz tuż za nawiasem otwierającym. [x ^] dopasowuje x lub daszek. Nawias zamykający można umieścić tuż za nawiasem otwierającym lub daszkiem negującym. [] x] odpowiada nawiasowi zamykającemu lub x. [^] x] odpowiada dowolnemu znakowi, który nie jest nawiasem zamykającym ani x. Myślnik można umieścić tuż po nawiasie otwierającym, tuż przed nawiasem zamykającym lub zaraz po karetce przeczącej.

W jakim języku piszesz wyrażenie regularne?


0

To rozwiązanie rozwiązało mój problem podczas zamiany tagu br na „\ n”.

alert(content.replace(/<br\/\>/g,'\n'));
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.