2010-11-26 44 views
7

我不知道如何用簡單的英文來解釋問題,所以我以自己的正則表達式爲例。我有一些類似的(該例子是相當多的簡化):如果多個事件匹配,是否有辦法捕獲每個組?

((\\d+) - (\\d+)\n)+ 

這種模式,這些線在一次匹配:

123 - 23 
32 - 321 
3 - 0 
99 - 55 

該模式包含3組:第一個行匹配時,第二個匹配行中的第一個數字,第三個匹配行中的第二個數字。

是否有可能獲得所有這些數字?匹配只有3個組。第一個返回99 - 55,第二個 - 99和第三個 - 55

SSCCE:

class Test { 
    private static final Pattern pattern = Pattern.compile("((\\d+) - (\\d+)\n)+"); 

    public static void parseInput(String input) { 

     Matcher matcher = pattern.matcher(input); 

     if (matcher.matches()) { 

      for (int i = 0; i <= matcher.groupCount(); i++) { 
       System.out.println("------------"); 
       System.out.println("Group " + i + ": " + matcher.group(i)); 
      } 
      System.out.println(); 
     } 

    } 

    public static void main(String[] args) { 
     parseInput("123 - 23\n32 - 321\n3 - 0\n99 - 55\n"); 
    } 
} 

回答

5

如果 (一個明顯的可能性),那麼每次調用 matcher.matches()時間,將其與下一場比賽更新。 因此,基本上,將if (matcher.matches())更改爲while (matcher.find()),即可開始使用。

編輯:其實,這不是matches,這是find做這個:

http://download.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#find%28%29

下面是使用它的一個例子:

http://download.oracle.com/javase/tutorial/essential/regex/test_harness.html

+0

是匹配器嗎?matches()或matcher.find(),每次調用它都會重新執行? (或兩者兼而有之!) – 2010-11-26 12:19:38

2

你試圖相互匹配線分開?

取出+僅匹配一行,並更改:

if (matcher.matches()) { 

到:

while (matcher.matches()) { 

,它會循環一次,每場比賽,並自動跳過匹配之間的不匹配文本。

請注意,matcher.group(0)返回整個匹配。實際組以1開頭。

7

Mike Caron的答案還有一點:如果簡單地用「while」替換「if」並使用「find」而不是「match」,程序將不起作用。您還應該更改正則表達式:應刪除最後一個帶有「+」的組,因爲您要搜索此模式的多次出現,而不是針對(..)+組的一次出現。

爲了清楚起見,這是最後的程序,工作原理:

class Test { 
    private static final Pattern pattern = Pattern.compile("(\\d+) - (\\d+)\n"); 

    public static void parseInput(String input) { 

     Matcher matcher = pattern.matcher(input); 

     while (matcher.find()) { 

      for (int i = 0; i <= matcher.groupCount(); i++) { 
       System.out.println("------------"); 
       System.out.println("Group " + i + ": " + matcher.group(i)); 
      } 
      System.out.println(); 
     } 
    } 

    public static void main(String[] args) { 
     parseInput("123 - 23\n32 - 321\n3 - 0\n99 - 55\n"); 
    } 
} 

它會給你的每一行,其中第一組是整個線和下面兩個組,每組包含許多三組。這是一個很好的教程,幫助我更好地理解它:http://tutorials.jenkov.com/java-regex/matcher.html

相關問題