繁体   English   中英

正则表达式在 Javascript 中匹配,但在 PCRE 中不匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM