Regex 为什么这个正则表达式会匹配,即使它应该失败?
当URL的格式为“msgID”或“msg=ID”时,我想提取消息ID的第一个实例,但当“msg”和“ID”之间有任何其他字符时,我不想提取 应为我提供消息ID的测试字符串:Regex 为什么这个正则表达式会匹配,即使它应该失败?,regex,nginx,pcre,Regex,Nginx,Pcre,当URL的格式为“msgID”或“msg=ID”时,我想提取消息ID的第一个实例,但当“msg”和“ID”之间有任何其他字符时,我不想提取 应为我提供消息ID的测试字符串: /forum/index.php/topic,101126.msg3826887.html#msg3826887 /forum/index.php?topic=101126.msg3826887#msg3826887 /forum/index.php?msg=3826887 应失败的测试字符串: /forum/index.
/forum/index.php/topic,101126.msg3826887.html#msg3826887
/forum/index.php?topic=101126.msg3826887#msg3826887
/forum/index.php?msg=3826887
应失败的测试字符串:
/forum/index.php?msgrad3826887
/forum/index.php?msg,3826887
这是我的正则表达式:
forum\/index.php.+?msg=?([0-9]*)
但是,当我在或中测试时,它们显示正则表达式成功地匹配了所有这些字符串
应该失败的测试不会给出捕获组的任何结果,但在其他方面似乎匹配成功
为什么会发生这种情况,我如何修复我的正则表达式?您的正则表达式匹配无效字符串,因为ID是可选的:
[0-9]*
可以匹配空字符串
只需将*
替换为+
,至少需要一位数字
这里有一个改进的版本,顺便说一句:
forum\/index\.php.+?\bmsg=?(\d+)
您应该转义
。我还在msg
之前添加了\b
,以确保msg
不是较长单词的一部分。请注意,在正则表达式意义上不需要转义,但您的语言/工具可能需要转义。您的正则表达式匹配无效字符串,因为ID是可选的:[0-9]*
可以匹配空字符串
只需将*
替换为+
,至少需要一位数字
这里有一个改进的版本,顺便说一句:
forum\/index\.php.+?\bmsg=?(\d+)
您应该转义
。我还在msg
之前添加了\b
,以确保msg
不是较长单词的一部分。请注意,转义/
在正则表达式意义上不是必需的,但您的语言/工具可能需要它。您在哪里使用它?重写规则?PHP代码?+?
是否导致它查找非空格字符的任意组合一次或多次?@nhahdh Nginx重写规则在何处使用?重写规则?PHP代码?是+?
导致它查找非空格字符的任意组合一次或多次吗?@nhahdh Nginx rewrite rules我以前从未见过\b
开关,谢谢分享improvement@Jeff这是一个零宽度断言,大致相当于(?:(?。它确保它出现的位置是一个单词边界(如果一个字符与\w
匹配,它会将其视为单词的一部分)。我以前从未见过\b
开关,谢谢分享improvement@Jeff这是一个零宽度断言,大致相当于(?:(?。它确保它出现的位置是单词边界(如果一个字符与\w
匹配,它将其视为单词的一部分)。