模式匹配 - 正则表达式

湿婆

用户输入格式:

[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]
]

Regex101Demo

解释:

每当找到 , 时 -->

,(?=(?:(?:[^\\[\\]]*[\\]\\[]){2})*[^\\[\\]]*$)

一个积极的向前看一直运行到字符串的末尾,在那里下一行

(?:[^\\[\\]]*[\\]\\[]){2})*确保 - 如果找到一个括号,它会被找到两次。那么最后一个 * 表示括号对的 0 次或多次重复。

为什么这很重要?从任何逗号开始,然后计算 [ 和 ] 括号的数量。你会看到,如果之后只有偶数个括号,你只需要用那个逗号分割。并且您不想为后面出现奇数括号的逗号拆分。这就是解释。

对于正则表达式的完整细分,您可以查看链接,其中右上部分逐个字符地给出了完整解释。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章