用户输入格式:
[fieldname1] 比较器 [fieldvalue1,fieldvalue2,value3],[fieldname2] 比较器 [fieldvalue1,value2,..],..
需要将其解析为:
1.[fieldname1]比较器[fieldvalue1,fieldvalue2,value3]
2.[fieldname2]比较器[fieldvalue1,value2,..]等等
(即)每个字段及其比较器和值必须分开。而比较器将是以下任何一项:
<=|>=|=|is|<|>|startswith|开始于|Beginswith|开始于|Endswith|Endswith|
包含
我使用的正则表达式:
([(.)+?](\s) (<=|>=|=|is|<|>|startswith|Starts with|Beginswith|Begins with|Ends with|Endswith|contains)(\s) [( .)+?](\,)*)
示例: [company] 包含 [abc,efg],[email] 包含 [cdf,test] 上面的解析正确没有问题。
问题:当字段名称或字段值包含符号“[”或“]”时,解析出错。
示例: [company] 包含 [ab[]c,efg],[email] 包含 [siva,test]
以上是有效的,但由于 [] 用作分隔符,它停止解析直到 [company] 包含 [ab[] 但我希望它像上面那样正确解析,例如,
1.[公司]包含[ab[]c,efg]
2.[email] 包含 [siva,test]
谢谢。
您可以尝试使用此正则表达式:
,(?=(?:(?:[^\\[\\]]*[\\]\\[]){2})*[^\\[\\]]*$)
拆分您的目标字符串应该为您提供拆分结果集的列表。您可以轻松地应用比较器匹配
final String regex = ",(?=(?:(?:[^\\[\\]]*[\\]\\[]){2})*[^\\[\\]]*$)";
final String string = "[company] contains [ab[]c,efg],[email] contains [siva,test]";
String[] res=string.split(regex);
System.out.println(Arrays.asList(res).toString());
通过使用它,您可以获得预期的结果。您可能需要检查的是,每个索引是否都包含您显示的正确比较器。如果没有,则将其从数组中删除。
上面的代码输出:
[
[company] contains [ab[]c,efg],
[email] contains [siva,test]
]
解释:
每当找到 , 时 -->
,(?=(?:(?:[^\\[\\]]*[\\]\\[]){2})*[^\\[\\]]*$)
一个积极的向前看一直运行到字符串的末尾,在那里下一行
(?:[^\\[\\]]*[\\]\\[]){2})*
确保 - 如果找到一个括号,它会被找到两次。那么最后一个 * 表示括号对的 0 次或多次重复。
为什么这很重要?从任何逗号开始,然后计算 [ 和 ] 括号的数量。你会看到,如果之后只有偶数个括号,你只需要用那个逗号分割。并且您不想为后面出现奇数括号的逗号拆分。这就是解释。
对于正则表达式的完整细分,您可以查看链接,其中右上部分逐个字符地给出了完整解释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句