我想分割字符串(可以更多对)
[tag1=val1] [tag2=val2] [tag3=val3]
到一个数组:
tag1=val1
tag2=val2
tag3=val3
...
n
有正则表达式适用于web正则表达式测试服务
\[([^\[\]]*)\]
但是当我尝试在java中使用它时,我得到空结果:
"[tag1=val1] [tag2=val2] [tag3=val3]".split("\\[([^\\[\\]]*)\\]"); \\empty
答案 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}}