2013-05-12 56 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

相關問題