java 正则表达式-仅当后一个字符后面没有前一个字符时,才匹配两个字符之间的内容

o7jaxewo  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(161)

我试图在Java中匹配JSON条件字符串,并一直在努力寻找解决方案。在这些条件字符串中,条件是JSON对象“{}”,其可以独立地或在组中被评估。这些组表示为条件对象“[]”的数组。我有一个解决方案,工作很好地匹配字符之间的内容为组和对象分别,但是,当我试图将组存储在其他组中时,这个问题就消失了。
示例字符串:

[{"field":"type","operand":"=","value":"column"}, "&&",
  [{"field":"type","operand":"=","value":"column"}, "||", 
   {"field":"type","operand":"=","value":"column"}], "||", 
   {"field":"type","operand":"=","value":"column"}]

预期的结果是匹配字符[和]之间(包括[和])的字符串内容。
我已经计算出我需要的是匹配[ .]的内容。[1]直到有一个]没有遵循(某处前面,我。(一)先有先有,后有后有。对]进行惰性搜索将在第一次出现时停止匹配,但进行贪婪匹配将匹配整个字符串直到最后一次出现,其中可能包含许多其他组/对象。我已经尝试过lookbehinds/lookaheads,但是这些需要静态定义的字符位置,并且不能扩展到找到(或不找到)字符的出现。
在这一点上,我被难住了,并将非常感谢您提供的任何建议。

9jyewag0

9jyewag01#

使用单个正则表达式在技术上是可行的,但可能不值得。请注意,链接的答案仅适用于一种类型的括号;你的程序更难,因为你有{} * 和 * []。
问题是嵌套表达式不是regular language;正则表达式库有时可以在扩展的帮助下解析非正则语言(如前向和后向引用),但结果通常是脆弱和不可读的。这个问题是quite famous on StackOverflow
由于您的输入已经是JSON字符串,所以您最好使用真实的的JSON解析器。我向你保证这会比你已经做过的事少得多。
如果你真的必须使用正则表达式,我建议用迭代的方式:
1.创建一个正则表达式,查找内部没有{}或[]的所有{}或[]。
1.在输入字符串中搜索匹配项。
1.用唯一的标记替换每个匹配项,如“TOKEN_N”。记住每个标记的匹配字符串是什么。
1.重复2-3,直到没有更多的匹配。
最后,您将把输入转换成

[TOKEN1, "&&", TOKEN2, "||", TOKEN3]

以及你替换的所有内容的递归字典:

TOKEN1={"field":"type","operand":"=","value":"column"}
TOKEN2=[TOKEN4, "||", TOKEN5]
TOKEN3={"field":"type","operand":"=","value":"column"}
TOKEN4={"field":"type","operand":"=","value":"column"}
TOKEN5={"field":"type","operand":"=","value":"column"}

这是一个字符串化的Abstract Syntax Tree表达式,从这里你可以任意处理它。

相关问题