我想创建一个可以选择{aa=xx bb=yy}
或{aa=xx}
这就是我在代码中使用的内容。
Pattern pattern = Pattern.compile("([{])(aa=\\S+)\\s*(bb=\\S+)?([}])");
final Matcher matcher = pattern.matcher(str);
有更好的方法吗?
答案 0 :(得分:1)
您可以使用命名捕获:
Pattern pattern = Pattern.compile("\\{(?<k1>[^=]+)=(?<v1>[^\\s}]+)(?>\\s+(?<k2>[^=]+)=(?<v2>[^}]+))?}");
然后在命名组中获取键和值(k1 v1 k2 v2)。
注意:将空格放在带有第二个键/值的可选组中更好,避免测试。
另一种方法是,如果在大括号内有不确定数量的键/值对:
Pattern pattern = Pattern.compile("(?:\\{|\\G)([^=\\s]+)=([^\\s}]+)(?:\\s*|})");
(我假设=
周围没有空格,您可以根据需要添加它们)
答案 1 :(得分:0)
一个小改进:您可以省略使用字符类捕获组以逃避特殊字符:只使用\{
代替([{])
和\}
而不是([}])
}。