正则表达式:不捕获匹配项,而是在匹配后捕获

时间:2019-02-20 19:12:32

标签: regex regex-lookarounds

关于SO的一千个正则表达式问题,因此,如果已经解决,我深表歉意。我确实先看了。

我有一个字符串:

Name Subname 11X22 88X620 AB33(20) YA5619 77,66

我需要捕获以下字符串:YA5619

我正在做的只是找到AB33(20),此后我一直捕获到第一个空格。但是AB33(20)可以是AB-33(20)AB33(-20)AB33(-1)

我的preg_match正则表达式为:(?<=\bAB\d{2}\(\d{2}\)\s).+?(?=\s)

\d{2}更改为\d+时为什么会出错?

对于最终结果,我认为此regix可以工作,但不行:

(?<=\bAB-?\d+\(-?\d+\)\s).+?(?=\s)

有什么主意我做错了吗?

2 个答案:

答案 0 :(得分:1)

对于大多数正则表达式而言,后视需要评估为固定长度的序列,因此您不能使用*+甚至{1,2}之类的可变量词。

您可以简单地匹配标记模式,然后用\K来代替它,而不必使用环视。

AB-?\d+(?:\(-?\d+\))? \K[^ ]+

演示:https://regex101.com/r/8XXngH/1

答案 1 :(得分:0)

这取决于语言。例如,如果在.NET中,则matches取决于后面的长度。

另一种解决方案可能是使用字符类并添加允许匹配的字符。然后匹配一个空白字符,并捕获一个匹配\S+的组,该组匹配一个空白字符的1+倍。

\bAB[()\d-]+\s\K\S+

说明

  • \bAB字面匹配的字面前缀,以防止AB成为较大匹配的一部分。
  • [()\d-]+匹配1个以上字符类别中列出的任何字符
  • \s匹配一个空白字符(或\s+匹配一个或多个)
  • \K重置报告的匹配项的起点(忘记匹配项)
  • \S+每组匹配1次以上而不是空格字符

Regex demo | Php demo