2012-08-02 53 views
1

我發現了一個正則表達式,它與用{}包圍的標記相匹配,但它似乎只能找到第一個找到的項目。Java與正則表達式匹配多個標記

如何更改以下代碼以便找到所有的令牌而不僅僅是{World},我需要使用循環嗎?

// The search string 
String str = "Hello {World} this {is} a {Tokens} test"; 

// The Regular expression (Finds {word} tokens) 
Pattern pt = Pattern.compile("\\{([^}]*)\\}"); 

// Match the string with the pattern 
Matcher m = pt.matcher(str); 

// If results are found 
if (m.find()) { 
    System.out.println(m); 
    System.out.println(m.groupCount()); // 1 
    System.out.println(m.group(0)); // {World} 
    System.out.println(m.group(1)); // World (Get without {}) 
} 

回答

1

是的,在您的代碼中,您只需進行一次匹配,並獲得在單一匹配中捕獲的組。

如果您想獲得其他匹配項,您必須繼續匹配,直到find()返回false。

因此,基本上所有你需要的是用while代替if,你就在那裏。

+0

感謝這個偉大的工程,只是想知道有沒有簡單的方法來獲得比賽的總額是多少?或者最好的辦法是將每個找到的項目在while循環中添加到總變量中? – zeddex 2012-08-02 11:39:54

4

groupCount()方法不會返回匹配的數量,它會返回此匹配程序模式中捕獲組的數量。您在您的模式中定義了一個組,因此此方法返回1.

您可以再次撥打find()查找與您的模式相匹配的下一個匹配項;它會嘗試找到與模式匹配的輸入序列的下一個子序列。當它返回false時,您將知道沒有更多匹配。

因此,你應該通過你的比賽像這樣的循環:

while (m.find()) { 
    System.out.println(m.group(0)); 
} 
+0

我接受了biziclop的答案,因爲它給了我我需要的解決方案,但是感謝您的解釋。這也是非常有用的知道。 – zeddex 2012-08-02 11:46:57