/ / Regex ucieczki z lub? - c #, regex

Regex ucieczki z lub \? - c #, regex

Czy ktoś może mi wyjaśnić, używając wyrażeń regularnych, gdy trzeba użyć podwójnego ukośnika odwrotnego lub pojedynczego ukośnika odwrotnego, aby uciec przed postacią?

Wiele referencji online wykorzystuje jeden backslash, a testerzy regex online działają z pojedynczymi backslaskami, ale w praktyce często muszę używać podwójnego ukośnika odwrotnego, aby uciec przed postacią.

Na przykład:

"SomeString."

Działa w internetowym testerze regex i pasuje do "SomeString", po którym następuje kropka.

Jednak w praktyce muszę użyć podwójnej ucieczki:

if (Regex.IsMatch(myString, "SomeString\."))

Odpowiedzi:

5 dla odpowiedzi № 1

C # nie ma specjalnej składni dlakonstrukcja wyrażeń regularnych, takich jak Perl, Ruby lub JavaScript. Zamiast tego używa konstruktora, który pobiera ciąg znaków. Jednak łańcuchy mają swój własny mechanizm ucieczki, ponieważ chcesz mieć możliwość umieszczania cudzysłowów w ciągu znaków. Tak więc istnieją dwa poziomy ucieczki.

Tak więc w wyrażeniu regularnym w oznacza literę "w", natomiast w oznacza znak słowny. Jednak jeśli tworzysz ciąg znaków "w", unikniesz postaci "w", co nie ma sensu, ponieważ znak "w" nie jest cytatem ani ukośnikiem odwrotnym, więc "w" == "w". Następnie ten ciąg zawierający tylko "w" dostajeprzekazane do konstruktora regexp, a skończysz dopasowując literę "w" zamiast dowolnego znaku słownego. Tak więc, aby przekazać ukośnik odwrotny do wyrenderowania, musisz wstawić dwa odwrotne ukośniki w ciągu literału (\w): jeden zostanie usunięty, gdy literał ciągu zostanie zinterpretowany, jeden zostanie użyty przez wyrażenie regularne.

Podczas pracy z wyrażeń regularnych bezpośrednio (np. W przypadku większości testerów regexp online lub przy użyciu ciągów dosłownych) @"..."), nie musisz się martwić ointerpretacja literałów łańcuchowych, a ty zawsze piszesz tylko jeden ukośnik odwrotny (z wyjątkiem sytuacji, gdy chcesz dopasować sam ukośnik odwrotny, ale potem "wracasz do odwrotnego ukośnika dla wyrażenia regularnego, a nie dla ciągu znaków).


3 dla odpowiedzi № 2

Jest także znakiem escape dla literałów ciągów w języku c #, więc pierwszy jest ucieczką do drugiego, który jest przekazywany do metody, a drugi z nich ucieka. w wyrażeniu regularnym.

Posługiwać się:

if (Regex.IsMatch(myString, @"SomeString."))

Jeśli chcesz uniknąć podwójnego ucieczki.


2 dla odpowiedzi nr 3

Używam dosłownego symbolu @(ciąg dosłowny), nie musisz ponownie uciekać od ukośnika.

if (Regex.IsMatch(myString, @"SomeString."))