正则表达式-无需组匹配的积极前瞻

时间:2019-06-16 09:31:23

标签: regex

是否有可能不会被添加到最终组中的正向超前组? 我似乎无法在组中已经使用?:的情况下使用?=,但是我只想检查是否存在具有前瞻性的组,但最后不使用它。

因此,当我将一些文本传递给该正则表达式时,我想检查常规模式是否匹配(这就是为什么我使用正向超前查询),但是我只想提取数字。

以下是示例-https://regex101.com/r/Q7WIUo/2

->以上所有正确,我想在magicalword之前找到最后一个数字,但它必须在前面包含XXX或YYY或ZZZ。但是如您所见,我有3组匹配,而我只需要第二组-可以吗?

1 个答案:

答案 0 :(得分:2)

您可以使用一个捕获组来捕获magical word之前的最后一个数字,因此您可以省略前行中的捕获组和最后(\D*)附近的捕获组:

^(?=.*\s(?:XXX|YYY|ZZZ)\s).*?(\d+(?:\.\d+)?)\D*\bmagicalword\b\D*$

您仍然可以使用(\d+(?:\.\d+)?)而不是使用([0-9,.]+)(您的示例数据仅包含由点分隔的十进制值),但这有点广泛,因为它也可以捕获{{1 }}

说明

  • ...字符串的开头
  • ^正向前进,断言右边是
    • (?=.匹配非捕获组中列出的选项之一
  • *\s(?:XXX|YYY|ZZZ)\s积极回望
  • )匹配除换行符非贪婪以外的所有字符
  • .*?匹配1个以上的数字和一个可选部分以匹配点和1个以上的数字
  • (\d+(?:\.\d+)?)匹配0次以上而不是数字
  • \D*在单词边界之间匹配神奇单词
  • \bmagicalword\b匹配0次以上而不是数字
  • \D*字符串结尾

Regex demo

如果字符串也可以以XXX YYY或ZZZ开头,则可以更改单词边界中的第一个$

\s