2013-05-12 50 views
3

RegEx的结果会排除其他RegEx的结果。例如,如果我使用模式我怎样才能获得RegEx的所有匹配?

[a-z&&[^aeiou]]{2} 

我尽力配合BCD,比赛将{} BC代替{BC,CD}

我在Java中这样做。

+2

注意:目前没有方法(AFAIK)获取可以在相同索引处开始的所有匹配项。例如aaa'的a *',它可以在索引0处有4个匹配。Marko Topolnik的答案涵盖了每个索引最多需要1次匹配的情况。 – nhahtdh 2013-05-12 10:19:08

回答

2

可以与涉及捕获组在先行得到这样的:

(?=([a-z&&[^aeiou]]{2})). 

你需要涉及Matcher.find一个循环,每一次查询匹配与group(1)让你的对手。主要的正则表达式匹配本身是不相关的,应该被忽略。

+0

为什么你需要向前看?最后的'。'是否阻止只包含最后一个字符的匹配? – escitalopram 2013-05-12 10:27:14

+0

'不。最后防止只包含最后一个字符的匹配吗?“不,不。但它确实阻止了空匹配(如果我们使用匹配空字符串的模式)。预见是解决这个问题的一种简便方法,您不必关心边界情况。 – nhahtdh 2013-05-12 10:46:24

+0

@escitalopram我没有试过这个,所以我保守地把'.'放在里面。我认为整个事情也没有问题。 – 2013-05-12 11:06:24

2

反复使用Matcher.find(int start)Matcher.start()可以找出下一个字符串索引。

String haystack="bcd"; 
Matcher m = pattern.matcher(haystack); 
int lookIndex=0; 
while(lookIndex < haystack.length() && m.find(lookIndex)) { 
    lookIndex=m.start()+1; 
    System.out.println("Found " + m.group()); 
} 
+0

这确实是一种解决方案,但是当模式可以匹配空字符串时,您必须非常小心... – nhahtdh 2013-05-12 10:13:24

+0

现在可以对其进行调整以避免出现OutOfBoundsException。还用匹配空字符串的模式成功测试了它。 – escitalopram 2013-05-12 10:35:41

相关问题