2

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

早些时候,我已经决定使用下一个正则表达式在 javascript 中执行类似的任务:

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

现在我在java中决定时遇到了麻烦:

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

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

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

谢谢你

4

1 回答 1

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));
}

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

输出: -

attr1 : val1
attr2 : val2
attr3 : val3

更新: -

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

Pattern pattern = Pattern.compile("(\\w+?)=(\\w+)");
于 2012-10-23T06:44:36.643 回答