【问题标题】:Regex grouping rules for alternation用于交替的正则表达式分组规则
【发布时间】:2020-12-19 02:01:48
【问题描述】:

正则表达式引擎如何知道以下内容:

lions|starz|summit

分为:

(?:lions)|(?:starz)|(?:summit)

不是这样的:

lion(?:s|s)tar(?:z|s)ummit

是否有一条关于交替的规则,描述它应该走多远或如何确定?

【问题讨论】:

  • |是明确的分界线。

标签: regex pcre


【解决方案1】:

管道符号 (|) 是一个特殊字符,不能在您尝试匹配的短语中使用,除非您对其进行转义。

因此,正则表达式引擎会读取非特殊字符,直到它到达非特殊字符并决定从那里做什么。

在你的情况下,它读取到并包括lions,然后找到一个特殊的|,告诉它有一个替代的追随者,即starz,然后是另一个特殊的|,表示下一个替代.

所以,一旦完成,它就知道它需要匹配lionsstarzsummit 中的任何一个。

它没有将它误认为lion(?:s|s)tar(?:z|s)ummit 之类的原因仅仅是因为您没有为它提供特殊字符(? 等 - 所以没有混淆。

并且没有关于它需要“向后走多远”的规则,如果有的话,它只是从第一个字符继续前进,直到它碰到告诉它停止的东西。你可以有 100 种替代品,但它仍然可以匹配其中任何一种。

如果您想匹配其中包含管道符号的文本,您可以使用反斜杠 (\) 将其转义,例如 before\|after

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多