2012-03-04 78 views
1

我試圖提取使用$()構造字符串引用的屬性的名稱。例如,如果bb=xo-xo,則"aa$(bb)aa"擴展爲"aaxo-xoaa"Java正則表達式 - 什麼是錯的這個代碼

下面是代碼:

public static void main(String[] args) { 
    final String PROPERTY_NAME_REGEX = "\\w+(?:\\.\\w+)*"; 
    final String PROPERTY_REFERENCE_REGEX = "\\$\\((" + PROPERTY_NAME_REGEX + ")\\)"; 
    Pattern pattern = Pattern.compile(PROPERTY_REFERENCE_REGEX); 
    String value = "hhh $(aa.bbcc.dd) @jj $(aakfd) j"; 
    Matcher matcher = pattern.matcher(value); 
    StringBuffer sb = new StringBuffer(); 
    while (matcher.find()) { 
    System.out.println(String.format("\"%s\" at [%d-%d)", 
     matcher.group(), 
     matcher.start(), 
     matcher.end())); 
    for (int i = 0; i < matcher.groupCount(); ++i) { 
     System.out.println(String.format("group[%d] = %s", i, matcher.group(i))); 
    } 
    } 
} 

並顯示:

"$(aa.bbcc.dd)" at [4-17) 
group[0] = $(aa.bbcc.dd) 
"$(aakfd)" at [22-30) 
group[0] = $(aakfd) 

但我希望得到以下的輸出:

"$(aa.bbcc.dd)" at [4-17) 
group[0] = aa.bbcc.dd 
"$(aakfd)" at [22-30) 
group[0] = aakfd 

我在做什麼錯?

+3

「有些人,當與面對問題,想'我知道,我會用正則表達式。'現在他們有兩個問題。「 - Jamie Zawinski – nfechner 2012-03-04 19:08:48

+0

「美麗在旁觀者的眼中」。 – mark 2012-03-04 19:10:35

+0

看看for循環。組索引從1開始,括起來的是括號 – Omnaest 2012-03-04 19:18:13

回答

0

組0總是整個匹配,而不管任何特定的捕獲組。最後,Matcher.groupCount()返回捕獲組的數量,不包括整個匹配。爲了得到結果你後,for循環更改爲以下(注意,它從1開始,並持續了一步,由於加等號):

for (int i = 1; i <= matcher.groupCount(); i++) { 
2

爲了回答您的具體問題,你應該看group[1],不group[0]

Matcher.groupCount()方法不包括group[0]在計數,因此您的for循環永遠不會顯示您group[1]匹配,因爲i < matcher.groupCount()是錯誤的。

更改條件i <= matcher.groupCount()和你的輸出就會更有意義。

這就是說,有這樣做比寫自己的正則表達式的更好的方法 - 例如http://api.dpml.net/ant/1.6.4/org/apache/tools/ant/filters/ExpandProperties.html

+0

同意。我有另一個問題 - http://stackoverflow.com/questions/9558411/is-there-such-a-thing-as-static-jar-linking-in-java – mark 2012-03-04 20:14:04