2012-03-15 60 views
0

我想匹配一個字符串中的兩個或更多單詞。字符串是My/word example/word我想提取My example。我到目前爲止所做的是:正則表達式匹配兩個以上的元素Java

 String test = "My/word example/word"; 
     Pattern pattern = Pattern.compile("((.*)\\/word){2,}"); 
     Matcher match = pattern.matcher(test); 
     if (match.find()) { 

       System.out.println(match.group(1)); 
      } 

但它只打印example/word,有什麼想法嗎?

+0

你能不能有'My'在一個捕獲組和另一個'example'?這種模式應該有多普遍? – mgibsonbr 2012-03-15 17:44:32

回答

4

如果你有一個捕獲組的任何重複,只會拍攝該組的最後一場比賽。在這裏你最好的選擇是簡化正則表達式匹配只有一個字,然後用match.find(),直到你沒有找到一個匹配:

String test = "My/word example/word"; 
Pattern pattern = Pattern.compile("(\\w+)/word"); 
Matcher match = pattern.matcher(test); 
while (match.find()) { 
    System.out.println(match.group(1)); 
} 

它不應該是很難在這裏補充一些邏輯來只打印如果你找到兩個或更多的匹配。

另外請注意,我修改您正則表達式了一下,正斜線不需要進行轉義,我代替.*\w+這應該是更好,因爲你不會貪婪地匹配到最後/word

0

可以使用非貪婪* - 運算符:

((.*?)\/word) 
+0

添加到此答案,通過羣組獲取(2) – 2012-03-15 17:48:16

0

是否有可能您使用了錯誤的組號碼?我想如果你使用group(2)

1

你可以使用/word部分的被動組,迭代匹配結果來構造最終的字符串。

String test = "My/word example/word"; 
Pattern pattern = Pattern.compile("(\\w*)(?:\\/word)"); 
Matcher match = pattern.matcher(test); 
String result = ""; 
while (match.find()) { 
    result += match.group(1) + " "; 
} 

System.out.println(result.trim()); 

輸出將是:

My example