2015-06-04 5 views
1

У меня есть следующее регулярное выражение:Несогласованность в Regex Match

^(?=.*\d)(?=.*[a-zA-Z])[[!-~]]{6,32}$ 

Это должно соответствовать всем строкам (без пробелов), которые содержат, по меньшей мере 1 цифру, 1 алфавитный характер, и длина которого составляет от 6 до 32 лет Я почти уверен, что мое регулярное выражение правильно, потому что оно отлично работает here. Однако, когда я использую Regex.IsMatch в C#, он не работает.

bool isValidInput = Regex.IsMatch(myValue, myRegex) // I expect this to be true but it's false 

Кроме C#, я также заметил, что некоторые другие тестеры не нравится мое регулярное выражение либо. Мне нравится this. Что случилось с моим регулярным выражением?

+0

http://www.regexr.com/ http://www.regexr.com/ является довольно хорошим сайтом для проверки ваших вещей в регулярном выражении –

+0

Под какой вход он терпит неудачу? –

+0

regexr.com не соответствует моим данным. Вход предоставляется в двух ссылках, которые я предоставил. Вход, который я использовал: abc3 # de – yazanpro

ответ

2

Это должно соответствовать всем строкам (без пробелов), которые содержат не менее 1 цифры, 1 алфавитный символ и длина которого составляет от 6 до 32 ...

[[!-~]] проблема с регулярным выражением, breakdown: (правая колонка)

Вместо этого, я уверен, что вы ищете ниже, \S матчей без пробельных символов.

^(?=.*\d)(?=.*[a-zA-Z])\S{6,32}$ 
+1

Идеальное предположение '\ S' - это то, что я искал. Благодаря, – yazanpro

1

Проблемы с регулярными выражениями швов быть [[!-~]] частью, попробуйте это вместо этого, так как Вы сказали:

Это должно соответствовать всем строкам (без пробелов)

^(?=.*\d)(?=.*[a-zA-Z])\S{6,32}$ 
2

Проблема с регулярным выражением является то, что [[!-~]] диапазон на самом деле 2 подмасок: [[!-~] класса символов и буквальным ].

Изменить его [!-~]:

enter image description here

Таким образом, использование ^(?=.*\d)(?=.*[a-zA-Z])[!-~]{6,32}$.

См. demo on REGEXSTORM that supports .NET regex. В то время как regex101.com классный, вы всегда должны быть очень внимательным тестированием .NET regexes. Некоторые функции не поддерживаются (вычитание класса, внешний вид переменной ширины, флажок справа налево и т. Д.).

Если вы хотите, чтобы потребовать использования каких-либо букв Unicode, используйте \p{L}:

^(?=.*\d)(?=.*\p{L})[!-~]{6,32}$ 

Та же проблема с [] можно наблюдать в Python vs. Java. Но this is a different story :)