为何正则表达式([ÆØÅæøåa-zA-Z0-9.-]+)$可匹配URL,另一种写法却不行?
为什么正则字符组位置不同会导致匹配失败?
这个问题的核心在于正则字符组中短横线(-)的特殊作用:当短横线出现在字符组的中间时,它会被解析为「范围运算符」,用来表示两个字符之间的所有字符;只有当它放在字符组的开头、结尾,或者被转义(\-)时,才会被当作字面意义的短横线。
我们来拆解你的两个正则:
1. 能匹配的正则:([ÆØÅæøåa-zA-Z0-9.-]+)$
这里的短横线位于字符组的倒数第二个位置(紧挨着]),所以正则引擎会把它当作字面的-字符。这个字符组包含了:
- 丹麦语特殊字符:
ÆØÅæøå - 大小写英文字母:
a-zA-Z - 数字:
0-9 - 点号:
. - 字面短横线:
-
正好覆盖了你URL片段里的所有字符(比如-、æ、å以及字母数字),所以能成功匹配。
2. 不能匹配的正则:([a-zA-Z0-9.-ÆØÅæøå]+)$
这里的短横线夹在.和Æ之间,变成了范围运算符,表示匹配从.(ASCII码46)到Æ(Unicode码U+00C6,十进制198)之间的所有字符。但你URL里的-字符的ASCII码是45,比.的46要小,所以不在这个范围内——也就是说,这个字符组根本没有包含字面的-字符!
当正则尝试匹配URL里的-时,找不到对应的匹配项,自然就匹配失败了。
关于HTML实体的情况
如果你用HTML实体(比如Æ代替Æ)直接写在字符组里,正则引擎不会把它解析为对应的特殊字符,而是会当作普通的&、A、E、l、i、g这些字符。同时,短横线的位置问题依然存在:只要它在字符组中间,就会被当作范围运算符,还是无法匹配字面的-,所以同样会失败。
怎么修复?
有两种简单的修复方式:
- 把短横线移到字符组的结尾(就像你第一个正则那样)
- 或者把短横线转义为
\-,这样不管放在哪个位置,都会被当作字面字符:([a-zA-Z0-9.\-ÆØÅæøå]+)$
内容的提问来源于stack exchange,提问作者Jiri
相关产品推荐
相关产品推荐

