关于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)
有什么主意我做错了吗?
答案 0 :(得分:1)
对于大多数正则表达式而言,后视需要评估为固定长度的序列,因此您不能使用*
或+
甚至{1,2}
之类的可变量词。
您可以简单地匹配标记模式,然后用\K
来代替它,而不必使用环视。
AB-?\d+(?:\(-?\d+\))? \K[^ ]+
答案 1 :(得分:0)
这取决于语言。例如,如果在.NET中,则matches取决于后面的长度。
另一种解决方案可能是使用字符类并添加允许匹配的字符。然后匹配一个空白字符,并捕获一个匹配\S+
的组,该组匹配一个空白字符的1+倍。
\bAB[()\d-]+\s\K\S+
说明
\bAB
字面匹配的字面前缀,以防止AB成为较大匹配的一部分。[()\d-]+
匹配1个以上字符类别中列出的任何字符\s
匹配一个空白字符(或\s+
匹配一个或多个)\K
重置报告的匹配项的起点(忘记匹配项)\S+
每组匹配1次以上而不是空格字符