【问题标题】:Capturing optional groups in regex在正则表达式中捕获可选组
【发布时间】:2017-02-26 15:17:17
【问题描述】:

我需要捕获模式中的可选文本,并在以下匹配场景中提取示例i9Caffèyou

  • 有效匹配:

    love!
    9 love!
    love Caffè!
    i love you!
    
  • 无效匹配:

    love
    iloveyou
    

我的rule[*] love [*]![*] 表示可以接受空白文本进行捕获。

我尝试创建正则表达式 ((?:.+) )?love( (?:.+))?! (online),但未能捕获正确的文本。

【问题讨论】:

  • 关于为什么匹配有效示例而不匹配无效匹配的规则是什么 - 有很多方法可以解释这一点。
  • 好吧,也许(?:(.+) )?love(?: (.+))?! 可以按预期工作?
  • 你说文本是可选的,然后说“爱”本身是无效的。好吧,它是什么?你确定你了解自己的要求吗?
  • @CrayonViolent “爱”后面缺少感叹号!
  • @WiktorStribiżew 是的,谢谢。我是 SO 新手,所以我不知道如何结束这个问题。

标签: regex


【解决方案1】:

您可以将您的capturing 替换为non-capturing groups

(?:(.+) )?love(?: (.+))?!
 ^^            ^^

regex demo

现在,组内的文本将不包含空格,因为它们是非捕获组的一部分,仅用于对子模式进行分组。

【讨论】:

  • 很抱歉给您添麻烦了,但是如果我想要字符 ! 可选,例如:regex101.com/r/ZptHNN/3 当前的正则表达式将无法正常工作,例如从 i love you! not 获取 you
  • 是的,! 在这里非常重要,因为它是一个强制性的子模式,并“锚定”了右侧的匹配。那么右手边界的规则是什么?
  • 您的意思是让(?: (.+))? 正常工作吗?右边应该始终是强制字符而不是可选字符?
  • 累积。根据您的评论,love or not 是有效匹配,(?:(.+) )?love(?: (.+))?(?: or)? not 匹配它。为什么会无效?
  • 好吧,如果love 之后有两个连续的空白符号,您可能会失败匹配 - (?:(.+) )?love(?: (\S.*))?(?: or)? not(?:(.+) )?love(?!\s{2})(?: (.+))?(?: or)? not 将起作用。
猜你喜欢
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2018-08-15
相关资源
最近更新 更多