用户输入格式:
[fieldname1] comparator [fieldvalue1,fieldvalue2,value3],[fieldname2] comparator [fieldvalue1,value2,..],..
需要将其解析为:
1.[fieldname1] comparator [fieldvalue1,fieldvalue2,value3]
2.[fieldname2] comparator [fieldvalue1,value2,..] and so on
(即)每个字段及其比较器和值都必须分开。 而比较器将是以下任意一种:
<=|>=|=|is|<|>|startswith|Starts with|Beginswith|Begins with|Ends with|Endswith|
包含
我使用的正则表达式:
([(.)+?](\s)(<=|>=|=|is|<|>|startswith|Starts with|Beginswith|Begins with|Ends with|Endswith|contains)(\s)[(.)+?](\,)*)
示例: [公司]包含[abc,efg],[电子邮件]包含[cdf,test] 以上已正确解析,没有问题。
问题: 当字段名或字段值包含符号“[”或“]”时,解析出错。
示例: [公司]包含[ab[]c,efg],[电子邮件]包含[siva,test]
上面是有效的,但由于 [] 用作分隔符,它会停止解析,直到 [company] 包含 [ab[] 但我希望它能够像上面那样正确解析,例如,
1.[公司]包含[ab[]c,efg]
2.[电子邮件]包含[siva,测试]
谢谢。
最佳答案
您可以尝试使用此正则表达式:
,(?=(?:(?:[^\\[\\]]*[\\]\\[]){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]
]
Explanation:
每当找到 , 时 -->
,(?=(?:(?:[^\\[\\]]*[\\]\\[]){2})*[^\\[\\]]*$)
积极的前瞻运行直到字符串末尾,其中包含以下行
(?:[^\\[\\]]*[\\]\\[]){2})*
确保 - 如果找到括号,则会找到两次。那么最后一个*表示括号对重复0次或多次。
为什么这很重要?从任何逗号开始,然后计算 [ 和 ] 括号的数量。您会发现,如果后面只有偶数个括号,则只需要用逗号分隔即可。并且您不想用逗号分隔后面的奇数个括号。这就是解释。
要了解正则表达式的完整详细信息,您可以查看链接,其中右上角逐个字符给出了完整的解释。
关于java - 模式匹配 - 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44949054/