我有以下正则表达式:
^(?=.*\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一样。我的正则表达式出了什么问题?
答案 0 :(得分:2)
这应匹配包含至少1位数,1个字母字符且长度在6到32之间的所有字符串(不带空格)...
[[!-~]]
是正则表达式的问题,breakdown :(右列)
相反,我非常确定您正在寻找以下内容,\S
匹配非空白字符。
^(?=.*\d)(?=.*[a-zA-Z])\S{6,32}$
答案 1 :(得分:2)
正则表达式的问题在于[[!-~]]
范围实际上是2个子图案:[[!-~]
字符类和文字]
。
将其更改为[!-~]
:
所以,请使用^(?=.*\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}$