2

我想创建一个可以选择{aa=xx bb=yy}{aa=xx}

这就是我在代码中使用的。

Pattern pattern = Pattern.compile("([{])(aa=\\S+)\\s*(bb=\\S+)?([}])");
final Matcher matcher = pattern.matcher(str);

有一个更好的方法吗?

4

2 回答 2

1

您可以使用命名捕获:

Pattern pattern = Pattern.compile("\\{(?<k1>[^=]+)=(?<v1>[^\\s}]+)(?>\\s+(?<k2>[^=]+)=(?<v2>[^}]+))?}");

然后您获得命名组(k1 v1 k2 v2)中的键和值。

注意:将空间放在具有第二个键/值的可选组中更好,避免测试。

如果您在花括号内有不确定数量的键/值对,则另一种方法是:

Pattern pattern = Pattern.compile("(?:\\{|\\G)([^=\\s]+)=([^\\s}]+)(?:\\s*|})");

(我假设 周围没有空格=,您可以根据需要添加它们)

于 2013-07-27T11:38:25.377 回答
0

一个小的改进:您可以省略使用字符类捕获组以转义特殊字符:只需使用\{代替([{])\}代替([}])

于 2013-07-27T11:33:24.843 回答