Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么这个正则表达式会匹配,即使它应该失败?_Regex_Nginx_Pcre - Fatal编程技术网

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

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.

当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.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
匹配,它将其视为单词的一部分)。