由正则表达式分割[tag1 = val1] [tag2 = val2] [tag3 = val3]

时间:2018-02-06 13:20:24

标签: java regex

我想分割字符串(可以更多对)

[tag1=val1] [tag2=val2] [tag3=val3]

到一个数组:

tag1=val1 
tag2=val2
tag3=val3
...
n

有正则表达式适用于web正则表达式测试服务

\[([^\[\]]*)\]

但是当我尝试在java中使用它时,我得到空结果:

"[tag1=val1] [tag2=val2] [tag3=val3]".split("\\[([^\\[\\]]*)\\]"); \\empty

3 个答案:

答案 0 :(得分:3)

如果您使用Matcher#find() 匹配字符串,那么您当前的正则表达式效果很好:

String s = "[tag1=val1] [tag2=val2] [tag3=val3]";
Pattern p = Pattern.compile("\\[([^\\[\\]]*)]");
Matcher m = p.matcher(s);
List<String> results = new ArrayList<>();
while(m.find()) {
    results.add(m.group(1)); // Get Group 1 value only (note you may trim it here)
}
System.out.println(results); // => [tag1=val1, tag2=val2, tag3=val3]

请参阅online Java demo

该模式确实有效:

  • \[ - 匹配[
  • ([^\[\]]*) - 是一个ID为1的捕获组,匹配除[]以外的0 +个字符 - 请注意[]必须转义Java正则表达式中的字符类
  • ] - 文字]字符(不必在字符类之外转义)。

答案 1 :(得分:2)

如果您想要拆分,则需要在] [之间拆分标记(这是您的分隔符)并删除前导和尾随括号。假设您的列表始终位于您发布的表单中,您可以尝试:

String input = "[tag1=val1] [tag2=val2] [tag3=val3]";
String[] tags = input.substring( 1, input.length() - 1 ).split( "\\]\\s*\\[" );

此处substring()用于删除第一个和最后一个字符,假设它们是[]。然后结果在] [上拆分,括号之间有任意数量的空格。

但是,最好只使用正则表达式并在循环中查找括号之间的匹配,正如其他人已经建议的那样。假设您可能希望单独获取标记名称和值,可以使用以下表达式:\[(.*?)=(.*?)\]。这将尽可能少地匹配并将标签名称收集到匹配的组1中,并将值收集到组2中。

如果你想让这个表达更安全,你可以禁止使用括号和与你的表达相似的等号,即\[([^\[\]=]*)=([^\[\]=]*)\]

短暂崩溃:

  • [^\[\]=]是一个负面字符类,除了[]=
  • 之外的任何内容
  • ([^\[\]=]*)将上述类中任意长度的匹配项捕获到一个组
  • \[([^\[\]=]*)=([^\[\]=]*)\]匹配您的班级的两个小组(见上文),由=分隔,并由[]
  • 括起来

答案 2 :(得分:0)

由于您希望将结果作为字符串列表获得,因此使用String.split似乎是一个很好的解决方案。试试以下正则表达式:

{{1}}