为什么这个正则表达式匹配,即使它应该失败?

Jef*_*man 0 regex pcre nginx

当URL的格式为"msgID"或"msg = ID"时,我想提取消息ID的第一个实例,但是当"msg"和"ID"之间有任何其他字符时,我想提取消息ID的第一个实例

测试应该给我消息ID的字符串:

/forum/index.php/topic,101126.msg3826887.html#msg3826887
/forum/index.php?topic=101126.msg3826887#msg3826887
/forum/index.php?msg=3826887
Run Code Online (Sandbox Code Playgroud)

测试应该失败的字符串:

/forum/index.php?msgrad3826887
/forum/index.php?msg,3826887
Run Code Online (Sandbox Code Playgroud)

这是我的正则表达式:

forum\/index.php.+?msg=?([0-9]*)

但是,当我在RubularRegexr中测试它时,它们显示正则表达式成功匹配所有这些字符串.

应该失败的测试不会为捕获组提供任何结果,但看起来成功匹配.

为什么会这样,我如何修复我的正则表达式?

Luc*_*ski 6

您的正则表达式匹配无效字符串,因为ID是可选的:[0-9]*可以匹配空字符串.

只需将*a 替换+为需要至少一位数.

这是BTW的改进版本:

forum\/index\.php.+?\bmsg=?(\d+)
Run Code Online (Sandbox Code Playgroud)

演示

你应该逃脱了..我\b之前也添加了msg以确保msg不是更长词的一部分.请注意,/正则表达式中不需要转义,但您的语言/工具可能需要转义.