我想在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]*)
但是,当我在Rubular或Regexr中测试时,它们会显示正则表达式成功匹配所有这些字符串。
应该失败的测试不会为捕获组提供任何结果,但看起来成功匹配。
为什么会发生这种情况,如何修复我的正则表达式?
答案 0 :(得分:6)
您的正则表达式匹配无效字符串,因为ID是可选的:[0-9]*
可以匹配空字符串。
只需将*
替换为+
即可至少需要一位数。
这是BTW的改进版本:
forum\/index\.php.+?\bmsg=?(\d+)
你应该逃过.
。我还在\b
之前添加了msg
,以确保msg
不是更长字的一部分。请注意,正则表达式中不需要转义/
,但您的语言/工具可能需要它。