正则表达式匹配不一致

时间:2015-06-04 19:19:56

标签: c# .net regex

我有以下正则表达式:

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

这应匹配包含至少1位,1个字母字符且长度在6到32之间的所有字符串(没有空格)。我几乎肯定我的正则表达式是正确的,因为它完美地工作{{3 }}。但是,当我在C#中使用Regex.IsMatch时,它不起作用。

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

除了C#,我还注意到其他一些测试人员也不喜欢我的正则表达式。像here一样。我的正则表达式出了什么问题?

3 个答案:

答案 0 :(得分:2)

  

这应匹配包含至少1位数,1个字母字符且长度在6到32之间的所有字符串(不带空格)...

[[!-~]]是正则表达式的问题,breakdown :(右列)

相反,我非常确定您正在寻找以下内容,\S匹配非空白字符。

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

答案 1 :(得分:2)

正则表达式的问题在于[[!-~]]范围实际上是2个子图案:[[!-~]字符类和文字]

将其更改为[!-~]

enter image description here

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

demo on REGEXSTORM that supports .NET regex。虽然regex101.com很酷,但你必须非常小心地测试那里的.NET regex。不支持某些功能(类减法,可变宽度后视,右到左标记等)。

如果您想要使用任何Unicode字母,请使用\p{L}

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

在Python与Java中可以观察到与[]相同的问题。但是this is a different story:)

答案 2 :(得分:1)

你的正则表达式接缝问题是[[!-~]]部分,请尝试这样做,因为你说:

  

这应该匹配所有字符串(没有空格)

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