2012-12-02 14 views
6

Mam problem z informowaniem Regex, aby zignorował sekwencje specjalne.Ignoruj ​​sekwencje specjalne Regex C#

Oto przykładowy kod:

string input = "?"; 
foreach (Match m in Regex.Matches(input, "?")) 
     { 
     ... 
     } 

Ale gdy jest on wykonywany, to rzuca się następujący błąd: „” parsowania - Kwantyfikator {x, y} za niczym.

Po prostu chcę "?" być traktowanym jako ciąg.

Dzięki.

EDIT: Próbowałem również:

foreach (Match m in Regex.Matches(input, "\?")) 
       { 
... 
       } 

który mówi mi, że to nie jest rozpoznany jako prawidłowy sekwencji ucieczki.

Próbowałem również:

foreach (Match m in Regex.Matches(input, "\x3f")) 
       { 
... 
       } 

Odpowiedz

11

NET oferuje funkcję, która nie każdy ucieka do ciebie automatycznie. Gdy masz jakiś ciąg wejściowy, który chcesz dopasować dosłownie (właśnie znaki, które ma), ale wiesz, że używasz wyszukiwania regex, a następnie uruchomić je za pośrednictwem tej metody:

string pattern = Regex.Escape(literalString); 

ten zajmie się dowolnymi postaciami, które mogą być metakodami dla wyrażeń regularnych.

MSDN on Escape

+0

Dziękuję, rozwiązałeś mój problem! (: –

2

Musisz uciec ? dla silnika regex, jak ? ma szczególne znaczenie jako kwantyfikator w wyrażeniach regularnych:

\? 

Będziesz także chciał użyć verbatim string literals, więc \ nie ma specjalnego znaczenia jako sekwencja wyjściowa ciągu C# - te dwie są równoważne - @"\?" i "\\?".

Więc:

string input = "?"; 
foreach (Match m in Regex.Matches(input, @"\?")) 
{ 
    ... 
} 

Generalnie backslash \ jest sekwencja ucieczki ciągu wyrażeń regularnych.

+0

Próbowałem, ale to nie jest rozpoznawane jako sekwencja ucieczki. Próbowałem również zastąpić "?" z "\ x3f" bez skutku. A co z innymi ciągami takimi jak: "+"? –

+0

@ user1869353 - Tak, musisz pamiętać, że pracujesz z _two_ languages ​​- istnieje ciąg znaków C# i regex escape. – Oded

+0

Użyj dwóch ukośników, a nie jednego. –