Java 按正则表达式拆分[tag1=val1][tag2=val2][tag3=val3]

Java 按正则表达式拆分[tag1=val1][tag2=val2][tag3=val3],java,regex,Java,Regex,我想拆分字符串(可以是更多对) 对数组执行以下操作: tag1=val1 tag2=val2 tag3=val3 ... n 有一个在web正则表达式测试服务上工作的正则表达式 \[([^\[\]]*)\] 但当我尝试在java中使用它时,得到的结果是空的: "[tag1=val1] [tag2=val2] [tag3=val3]".split("\\[([^\\[\\]]*)\\]"); \\empty 如果使用Matcher#find()匹配字符串,则当前正则表达式运行良好: Str

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

对数组执行以下操作:

tag1=val1 
tag2=val2
tag3=val3
...
n
有一个在web正则表达式测试服务上工作的正则表达式

\[([^\[\]]*)\]
但当我尝试在java中使用它时,得到的结果是空的:

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

如果使用
Matcher#find()
匹配字符串,则当前正则表达式运行良好:

String s=“[tag1=val1][tag2=val2][tag3=val3]”;
Pattern p=Pattern.compile(“\\[([^\\[\\]]*])”;
匹配器m=匹配器p;
列表结果=新建ArrayList();
while(m.find()){
results.add(m.group(1));//仅获取组1的值(注意,您可以在此处对其进行修剪)
}
System.out.println(结果);//=>[tag1=val1,tag2=val2,tag3=val3]

这种模式确实有效:

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

如果使用
匹配器#find()匹配字符串,则当前正则表达式运行良好。

String s=“[tag1=val1][tag2=val2][tag3=val3]”;
Pattern p=Pattern.compile(“\\[([^\\[\\]]*])”;
匹配器m=匹配器p;
列表结果=新建ArrayList();
while(m.find()){
results.add(m.group(1));//仅获取组1的值(注意,您可以在此处对其进行修剪)
}
System.out.println(结果);//=>[tag1=val1,tag2=val2,tag3=val3]

这种模式确实有效:

  • \[
    -匹配
    [
  • ([^\[\]]*)
    -是ID为1的捕获组,与0+字符匹配,而不是
    [
    ]
    -请注意,必须转义Java正则表达式中字符类内的
    [
    ]
  • ]
    -文字
    ]
    字符(不必在字符类之外转义)
如果要拆分,您需要在标签(这是您的分隔符)之间拆分
][
,并去掉前导和尾随括号。假设您的列表始终以您发布的形式显示,您可以尝试以下操作:

String input = "[tag1=val1] [tag2=val2] [tag3=val3]";
String[] tags = input.substring( 1, input.length() - 1 ).split( "\\]\\s*\\[" );
此处使用
substring()
剥离第一个和最后一个字符,假设它们是
[
]
。然后在
][
上拆分结果,括号之间有任意数量的空格

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

如果您想使该表达式更加安全,可以禁止使用与表达式类似的括号和等号,即
\[([^\[\]=]*)=([^\[\]=]*)\]

短期细分:

  • [^\[\]=]
    是一个负字符类,与
    [
    ]
    =
    以外的任何字符都不匹配
  • ([^\[\]=]*)
    将上述类的任意长度的匹配捕获到一个组中
  • \[([^\[\]=]*)=([^\[\]=]*)\]
    匹配您的类的两个组(见上文),由
    =
    分隔,并由
    [
    ]
    括起
如果要拆分,您需要在标签(这是您的分隔符)之间拆分
][
,并去掉前导和尾随括号。假设您的列表始终以您发布的形式显示,您可以尝试以下操作:

String input = "[tag1=val1] [tag2=val2] [tag3=val3]";
String[] tags = input.substring( 1, input.length() - 1 ).split( "\\]\\s*\\[" );
此处使用
substring()
剥离第一个和最后一个字符,假设它们是
[
]
。然后在
][
上拆分结果,括号之间有任意数量的空格

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

如果您想使该表达式更加安全,可以禁止使用与表达式类似的括号和等号,即
\[([^\[\]=]*)=([^\[\]=]*)\]

短期细分:

  • [^\[\]=]
    是一个负字符类,与
    [
    ]
    =
    以外的任何字符都不匹配
  • ([^\[\]=]*)
    将上述类的任意长度的匹配捕获到一个组中
  • \[([^\[\]=]*)=([^\[\]=]*)\]
    匹配您的类的两个组(见上文),由
    =
    分隔,并由
    [
    ]
    括起

当您希望以字符串列表的形式获得结果时,使用String.split似乎是一个很好的解决方案。请尝试以下正则表达式:

"[tag1=val1] [tag2=val2] [tag3=val3]".split("(?:\\] *)?\\[|\\]$");

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

"[tag1=val1] [tag2=val2] [tag3=val3]".split("(?:\\] *)?\\[|\\]$");

不使用该正则表达式进行拆分,匹配并获取组1值。该正则表达式为:
\w+=\w+
不使用该正则表达式进行拆分,匹配并获取组1值。该正则表达式为:
\w+=\w+