java - 模式匹配 - 正则表达式

标签 java regex

用户输入格式:

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

Regex101Demo

Explanation:

每当找到 , 时 -->

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

积极的前瞻运行直到字符串末尾,其中包含以下行

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

为什么这很重要?从任何逗号开始,然后计算 [ 和 ] 括号的数量。您会发现,如果后面只有偶数个括号,则只需要用逗号分隔即可。并且您不想用逗号分隔后面的奇数个括号。这就是解释。

要了解正则表达式的完整详细信息,您可以查看链接,其中右上角逐个字符给出了完整的解释。

关于java - 模式匹配 - 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44949054/

相关文章:

java - 如何使用正则表达式分割2个字符串?

javascript - 如何从字符串中删除所有字符

python - 带有 python requests 模块的多行正则表达式

Java 8 : How Lambda expression impacts

java - 使用 SLF4J 库代替 Apache Log4j 是否还有其他优势?

java - Hibernate findById 的问题

javascript - 只需要获取 ID 的一部分(最后一个下划线之前的所有内容)

java - 如何在 Android 中加密 URL 参数并使用 PHP 解密?

java - Gradle 为 Spring 获取错误的库版本

javascript - 检查值是否具有给定字符 - RegEx