【发布时间】:2020-12-19 02:01:48
【问题描述】:
正则表达式引擎如何知道以下内容:
lions|starz|summit
分为:
(?:lions)|(?:starz)|(?:summit)
不是这样的:
lion(?:s|s)tar(?:z|s)ummit
是否有一条关于交替的规则,描述它应该走多远或如何确定?
【问题讨论】:
-
|是明确的分界线。
正则表达式引擎如何知道以下内容:
lions|starz|summit
分为:
(?:lions)|(?:starz)|(?:summit)
不是这样的:
lion(?:s|s)tar(?:z|s)ummit
是否有一条关于交替的规则,描述它应该走多远或如何确定?
【问题讨论】:
管道符号 (|) 是一个特殊字符,不能在您尝试匹配的短语中使用,除非您对其进行转义。
因此,正则表达式引擎会读取非特殊字符,直到它到达非特殊字符并决定从那里做什么。
在你的情况下,它读取到并包括lions,然后找到一个特殊的|,告诉它有一个替代的追随者,即starz,然后是另一个特殊的|,表示下一个替代.
所以,一旦完成,它就知道它需要匹配lions、starz 和summit 中的任何一个。
它没有将它误认为lion(?:s|s)tar(?:z|s)ummit 之类的原因仅仅是因为您没有为它提供特殊字符(、? 等 - 所以没有混淆。
并且没有关于它需要“向后走多远”的规则,如果有的话,它只是从第一个字符继续前进,直到它碰到告诉它停止的东西。你可以有 100 种替代品,但它仍然可以匹配其中任何一种。
如果您想匹配其中包含管道符号的文本,您可以使用反斜杠 (\) 将其转义,例如 before\|after
【讨论】: