2012-03-04 79 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