我有一个这样的字符串: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,或者我需要进行两步提取?
谢谢
答案 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+)");