2013-07-02 3 views
2

Этот Regex: "!"Regex получает Match Wrong

^[a-zA-Z0-9 -.,()/\n/\r]+$ 

в .NET всегда соответствует

"#" или "$" или или "%" или "&" или "*" или "+"

Так быть ясно, эта линия:

Regex.IsMatch("!", @"^[a-zA-Z0-9 -.,()/\n/\r]+$"); 

возвращает истину. Почему это происходит?

ответ

10

- при использовании в классе символов изображает диапазон

Таким образом, вы пытаетесь соответствовать символы из space до .

Move - до конца или начало символьного класса или избежать его \-

Теперь, ссылаясь на ascii table, вы указываете диапазон от десятичного знака ascii от 32 до 46, который включает !, ", #, $, % ........


Таким образом, это должно быть

^[-a-zA-Z0-9 .,()/\n/\r]+$ 
^

или

^[a-zA-Z0-9 .,()/\n/\r-]+$ 
        ^

или избежать его

^[a-zA-Z0-9 \-.,()/\n/\r]+$ 
      ^
+0

..or поставил - сразу после матча диапазона, например, '[0-9-a-z]' –

+0

Разве он не может просто уйти от? '^ [a-zA-Z0-9 \ -.,()/\ n/\ r] + $' – Stormenet

+0

@Stormenet ohh..yes действительно ..edited ans – Anirudha

2

Hyphen в классе символов должен быть либо в первой, либо в последней позиции, иначе он должен быть экранирован. Он должен работать:

^[a-zA-Z0-9 .,()/\n/\r-]+$ 

Или:

^[-a-zA-Z0-9 .,()/\n/\r]+$ 

Или:

^[a-zA-Z0-9 \-.,()/\n/\r]+$