这两个正则表达式模式有何不同?

3

我正在尝试在一个Web应用程序中验证公司名称,并使用了这个正则表达式模式:

^[a-zA-Z_'\\s,;.-0-9]{1,100}$

以上模式会拒绝值为10004 Estates Limited的输入。
但如果我将0-9提前,模式变成:
^[a-zA-Z0-9_'\\s,;.-]{1,100}$

那么它就可以工作了。我是一个新手,对于正则表达式和模式不太熟悉,但我知道我应该更多地使用它,所以我希望能够明确这一点。谢谢。


在第二种情况下,您的初始允许字符列表中包含0-9,因此允许数字,但第一种情况却拒绝了它。 - AurA
2个回答

7
在字符类中,-是一个特殊字符,因此.-0-9含义不明确,可能会被理解为.0-9的范围,实际上是包括了字符./09-
如果要在字符类中包含连字符,您需要对其进行转义或将其放置在字符类的开头或结尾(这可能是您在第二个正则表达式中所做的,也许是出于偶然)。
编辑后添加:以上猜测似乎正确,至少对于.NET的正则表达式引擎来说是这样的。
PS> [char[]](32..127) -match '[a-zA-Z_''\s,;.-0-9]'

'
,
-
.
/
0
9
;
A
...

2
可能是因为第一个字符组中有"-"符号导致的。
^[a-zA-Z_'\s,;.\-0-9]{1,100}$

将其转义后就没问题了。

记住,在字符组内部,您需要转义的字符变成

backslash \
caret ^
hyphen -

你只需要在字符类的开头转义 ^。虽然我还没有看到有人犯这个错误。中间的连字号更常见。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接