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

时间:2014-12-12 14:14:13

标签: regex nginx pcre

我想在URL格式为" msgID"时提取消息ID的第一个实例。或" msg = 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.php?msgrad3826887
/forum/index.php?msg,3826887

这是我的正则表达式:

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

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

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

为什么会发生这种情况,如何修复我的正则表达式?

1 个答案:

答案 0 :(得分:6)

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

只需将*替换为+即可至少需要一位数。

这是BTW的改进版本:

forum\/index\.php.+?\bmsg=?(\d+)

Demo

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