在正则表达式中捕获可选组

3

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

  • Valid matches:

    love!
    9 love!
    love Caffè!
    i love you!
    
  • Invalid matches:

    love
    iloveyou
    

我的规则是:[*] 爱 [*]!,其中[*]表示可以接受捕获的空白文本。

我尝试使用正则表达式 ((?:.+) )?love( (?:.+))?! (在线测试),但未能捕获正确的文本。


有关为什么您会匹配有效示例但不匹配无效匹配的规则 - 这有很多解释方法。 - Theo
4
好的,也许“也许爱?”这个正则表达式符合预期?请注意,这是对链接中提供的正则表达式的翻译。 - Wiktor Stribiżew
你说文本是可选的,但却表示仅有“love”是无效的。这到底是怎么回事?你确定自己理解自己的要求吗? - CrayonViolent
@CrayonViolent,“love”后面缺少感叹号! - MiP
@WiktorStribiżew 是的,谢谢。我是 SO 的新手,不知道如何关闭这个问题。 - MiP
显示剩余2条评论
1个回答

2

您可以使用非捕获组来替换捕获组

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

请查看正则表达式演示 现在,你在组内的文本将没有空格,因为它们是非捕获组的一部分,只用于分组子模式。

抱歉打扰您,但如果我想让字符 ! 可选,例如:https://regex101.com/r/ZptHNN/3 当前的正则表达式将无法正确工作,比如从 i love you! not 中获取 you - MiP
是的,在这里 ! 非常重要,因为它是一个必须的子模式,并且在右侧“锚定”匹配。那么右手边界的规则是什么? - Wiktor Stribiżew
你的意思是为了让 (?: (.+))? 正确工作,右侧应该始终有必填字符而不是可选字符吗? - MiP
1
如果在“love”之后有两个连续的空格符,则匹配可能失败 - “(?:(.+)) ?love(?: (\S.*))?(?: or)? not”或“(?:(.+) )?love(?!\s{2})(?: (.+))?(?: or)? not”将适用。 - Wiktor Stribiżew
让我们在聊天中继续这个讨论 - MiP
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接