2017-06-14 28 views
2

我试图匹配所有在句子中匹配正则表达式的组,但这些组在句子中具有共同字符。 我面对这个问题: 为例,在这样的句子:使用常见字符的正则表达式捕获组

A + B + C + d

我想catpure:

A + B 

然后

B + C 

then

C + D 

随着java.utils.regex.Matcher.find(带图案([A-Z] \+ [A-Z])regex101) 它开始只有最后匹配字符所以我只匹配A + B则C + D.

后下一组匹配

有没有办法用正则表达式来做到这一点?

+1

之前,我们建议任何解决方案后,我们应该知道输入的所有要求。否则,我们需要在每次决定告诉我们更多关于每个单独需求的信息时改变我们的想法。 – Pshemo

+0

现在,其中一个想法将匹配一个部分(A +),并使用前瞻来捕获另一个(B)。如何编写它取决于实际的数据格式。 – Pshemo

+0

谢谢@Pshemo您的回答! 没有特殊的数据格式。在那之后,我只想把A和B联系起来,然后把B联系到C,然后把C联系到D中。 问题在于,如果我没有弄错,在第一场比赛中B不在一个组中。 – tropseraph68

回答

3

我先行内同时匹配,则消耗1

查找全球(?=([A-Z]\s*\+\s*[A-Z]))[A-Z]
打印第1组每场比赛或者只是得到一个数组。

重叠工作匹配与消费。
在断言中匹配比需要的更多,然后消耗更少。
消费重新定位下一场比赛的开始。

此过程使其重叠。

扩展

(?= 
     ([A-Z] \s* \+ \s* [A-Z]) # (1) 
) 
[A-Z] 

匹配

** Grp 1 - (pos 0 , len 5) 
A + B 
    ** Grp 1 - (pos 4 , len 5) 
B + C 
    ** Grp 1 - (pos 8 , len 5) 
C + D 
+0

最后一个'[A-Z]'是什么? '“(?=([A-Z] \\ s * \\ + \\ s * [A-Z]))”'也适用。 – saka1029

+0

@ saka1029 - 是的。你找到的东西叫做_bump along_。如果正则表达式引擎匹配零宽度断言并且没有消耗任何东西(即最后一个“[A-Z]”),它会自动将当前位置增加1个字符。所以,这个用于这个'1234'的'(?=(。))'会找到4个匹配项。现实情况是'[AZ]'可以是一个大的子表达式,其自然长度可以大于1.在这种情况下,您需要直接使用它,所以它不会被困在下一场比赛的+1位置。当然如果'[A-Z]'是你的单位。 – sln

+0

@ saka1029 - 示例https://regex101.com/r/Bgm2j0/2而非此https://regex101.com/r/Bgm2j0/3 – sln