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