[英]Regex is matching in Javascript but not PCRE
我正在尝试将以下字符串与正则表达式匹配所有分数或 'evs' 和字符串 (string1, string2)。 字符串可以包含任意数量的空格('String 1'、'The String 1'、'The String Number 1')。
10/3 string1 evs string2 8/5 mon 19:45 string1 v string2 1/1 string1 v string2 1/1
以下正则表达式适用于 Javascript,但不适用于 PHP。 没有返回错误,只有 0 个结果。
(\d{1,3}\/\d{1,3}|evs).*?(.+).*?(\d{1,3}\/\d{1,3}|evs).*?(.+).*?(\d{1,3}\/\d{1,3}|evs).*?(.+) v (.+).*?(\d{1,3}\/\d{1,3}|evs).*?(.+) v (.+).*?(\d{1,3}\/\d{1,3}|evs)
这是预期的结果,除了第 6 组和第 7 组(使用 Javascript 运行):
如果我添加一个?
到第一个(.+)
使其变为(.+?)
,我得到了想要的结果,但第一个字符串没有被捕获:
一旦我删除?
要捕获整个字符串,则不会返回任何结果。 有人可以弄清楚这里发生了什么吗?
在 PCRE/PHP 中,您可以使用
$regex = '(\d{1,3}\/\d{1,3}|evs)\s+(\S+)\s+((?1))\s+(\S+)\s+((?1))\s+(.+?)\s+v\s+(\S+)\s+((?1))\s+(\S+)\s+v\s+(\S+)\s+((?1))';
if (preg_match_all($regex, $text, $matches)) {
print_r($matches[0]);
}
查看正则表达式演示
关键是你不能过度使用.*?
/ .+
在模式的中间,这会导致灾难性的回溯。
您需要使用精确的模式来匹配空白和非空白字段,并且只使用.*?
/ .+?
其中字段可以包含任意数量的空格和非空格字符。
细节
(\\d{1,3}\\/\\d{1,3}|evs)
- 第 1 组(稍后可以使用(?1)
子程序访问其模式):一到三位数, /
然后是一到三位数, 或evs
\\s+(\\S+)\\s+
- 1+ 个空格,第 2 组匹配 1+ 个非空格字符,1+ 个空格((?1))
- 第 3 组与第 1 组模式的匹配方式相同\\s+(\\S+)\\s+((?1))\\s+
- 1+ 个空格,第 4 组匹配 1+ 个非空格,1+ 个空格,第 5 组与第 1 组模式,1+ 个空格(.+?)
- 第 6 组:尽可能少地匹配除换行符以外的任何 1 个或多个字符\\s+v\\s+
- v
用 1+ 个空格包围(\\S+)
- 第 7 组:1+ 个非空格\\s+((?1))\\s+
- 1+ 个空格,第 8 组,第 1 组模式,1+ 个空格(\\S+)
- 第 9 组:1+ 个非空格\\s+v\\s+
- v
用 1+ 个空格包围(\\S+)\\s+((?1))
- 第 10 组:1+ 非空格,然后是 1+ 空格和具有第 1 组模式的第 11 组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.