java正则表达式:组计数固定

时间:2012-10-23 06:31:18

标签: java regex

我有一个这样的字符串:obj[attr1=val1 attr2=val2 attr3=val3]
我需要提取对象名称和属性。

早些时候,我已经使用下一个regexp在javascript中决定了类似的任务:

/^(\w+)(?:\[(\w+=\w+)(?:\s(\w+=\w+))*\])?$/

现在我在java中遇到了麻烦:

Pattern pathPattern = Pattern.compile("^(\\w+)(?:\\[(\\w+=\\w+)(?:\\s+(\\w+=\\w+))*\\])?$");

我只得到一个对象名称和第一个属性。 似乎Mather类在不考虑符号“*”的情况下获得与“()”的计数相对应的组计数。

是否有可能像js regexp那样使用java reg exp,或者我需要进行两步提取?

谢谢

1 个答案:

答案 0 :(得分:4)

Matcher.groupCount()只计算左括号的数量,并将它们视为一个组。因此,您打开的括号数将是组计数(假设您没有使用任何非捕获组)。

您可以使用以下模式获取[.*]中的值: -

Pattern pattern = Pattern.compile("(?:\\b)(\\w+?)=(\\w+?)(?:\\b)");
Matcher matcher = pattern.matcher(str);

while (matcher.find()) {
    System.out.println(matcher.group(1) + " : " + matcher.group(2));
}

这将匹配attr=val[内的所有]对。

输出: -

attr1 : val1
attr2 : val2
attr3 : val3

更新: -

由于您不必在上面的字符串中进行边界检查,因此上述模式甚至可以简化为: -

Pattern pattern = Pattern.compile("(\\w+?)=(\\w+)");