【问题标题】:Match groups inside 2 parenthesis2 括号内的匹配组
【发布时间】:2021-05-04 21:00:00
【问题描述】:

我很难让它发挥作用。我有一个像这样的字符串:

((a and b) and not (c and d)) 或 ((e and f and h) and not (c and d)) 或 ((h and i) and not (k and d)) 。 .....

我需要的是匹配上面的字符串并在每两个括号((我的组))之间捕获文本,例如:

  • 第 1 组:((a 和 b)而不是(c 和 d))
  • 第 2 组:((e 和 f 和 h)而不是(c 和 d))
  • 第 3 组:(c 和 d)) 或 ((h 和 i) 而不是 (k 和 d))

并用“或”运算符分隔。

这是我的正则表达式:

(\({2}.+?\){2})(?: (?:or) (\({2}.+?\){2}))+

当我单独使用正则表达式(\({2}.+?\){2}) 时,它的第一部分匹配两个括号之间的所有组。但是,当我添加第二部分以匹配由“或”(?:or) (\({2}.+?\){2}))+ 分隔的所有组时,它不起作用 - 似乎与下面的文本匹配,这是不够的:

((a and b) and not (c and d)) and ((a and b) and not (c and d)).

感谢您的帮助

【问题讨论】:

  • 你可以试试(\(\(.*?\)\))(?:\h+or\h+|$)
  • 感谢您的回复,但我的问题是关于“或”运算符,我需要匹配所有字符串然后捕获组。如果整个文本不匹配,则无需获取组。
  • 它没有用 + 它提供 3 场比赛和一组,而我需要的是获得 1 场比赛并捕获这三个组(由您的提议中未考虑的“或”分隔).谢谢你
  • 您可能不知道您不能单独获得重复的组。请阅读它。
  • 看这个演示:regex101.com/r/lNXTnc/1我有这些捕获组没有or

标签: java regex match


【解决方案1】:

你可以在 Java 中使用这个正则表达式:

(?:^|(?!^)\G\h+or\h+)(\(\((?:(?!\)\)).)++\)\))(?=(?:\h+or\h+\(\((?:(?!\)\)).)++\)\))*$)

RegEx Demo

正则表达式详细信息:

  • (?::启动非捕获组
    • ^: 匹配起始位置
    • |: 或者
    • \G\h+or\h+:从上一场比赛结束开始,匹配or,周围有1+个空格
  • ):结束非捕获组
  • (: 启动捕获组 #1
  • \(\(:比赛开始((
    • (?:(?!\)\)).)++:匹配任何字符的 1+,只要它前面没有 ))++ 是所有格量词
    • \)\):比赛结束))
  • ): 结束捕获组 #1
  • (?=\h+or\h+|$):提前断言我们有一个or,周围有空格或字符串结尾

【讨论】:

  • 感谢您为帮助我所做的一切努力。我的目标是验证这个文本(这个字符串):((a and b) and not (c and d)) or ((a and b) and not (c and d)) or ((a and b) and not (c 和 d)),然后捕获组。因此,您提供给我的正则表达式不会执行验证步骤。换句话说 'myString'.matches("(?:^|\\G\\h+or\\h+)(\(\((?:(?!\)\)).)++\)\ ))(?=\\h+or\\h+|$)") 给我 False。
  • 你错了。上面的正则表达式确实验证了:((a and b) and not (c and d)) or ((a and b) and not (c and d)) or ((a and b) and not (c and d)),你可以在这里看到:regex101.com/r/XhhbLx/1
  • 它匹配三个部分而不是一个,当我使用 mystring.match (您的正则表达式)通过 java 时,它给了我错误。我认为这是因为您的正则表达式提供了 3 场比赛,而不仅仅是一场。虽然我希望有 1 场单场比赛,但要捕获几个组(在括号中)。我分两部分做,因为似乎没有其他方法可以做到。
  • 这两个部分是超级低效的方法,尤其是如果输入是一个大字符串。我提供的这个正则表达式不适用于.match。您必须将它与 PatternMatcher.find() 方法一起使用。我提供的链接中有一个示例 Java 代码。
  • 查看这个演示:regex101.com/r/4FElGg/1你的字符串不匹配
【解决方案2】:

我将问题分为 2 个级别。

  • 第一级包括使用此正则表达式验证文本:

(?:((?:([A-Za-z0-9-: ]+)|([A-Za-z0-9-: ]+) and not ([A-Za-z0-9-: ]+)))(?: or (?:((?:([A-Za-z0-9-: ]+)|([A-Za-z0-9-: ]+) and not ([A-Za-z0-9-: ]+)))))+)

  • 第二级包括使用(({2}.+?){2}) 捕获组(在java 中使用匹配器)。 感谢@Anubhava 先生的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多