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中
如果您想使该表达式更加安全,可以禁止使用与表达式类似的括号和等号,即\[([^\[\]=]*)=([^\[\]=]*)\]
短期细分:
是一个负字符类,与[^\[\]=]
、[
和]
以外的任何字符都不匹配=
将上述类的任意长度的匹配捕获到一个组中([^\[\]=]*)
匹配您的类的两个组(见上文),由\[([^\[\]=]*)=([^\[\]=]*)\]
分隔,并由=
和[
括起]
"[tag1=val1] [tag2=val2] [tag3=val3]".split("(?:\\] *)?\\[|\\]$");
由于您希望以字符串列表的形式获得结果,因此使用String.split似乎是一个很好的解决方案。请尝试以下正则表达式:
"[tag1=val1] [tag2=val2] [tag3=val3]".split("(?:\\] *)?\\[|\\]$");
不使用该正则表达式进行拆分,匹配并获取组1值。该正则表达式为:
\w+=\w+
不使用该正则表达式进行拆分,匹配并获取组1值。该正则表达式为:\w+=\w+