【问题标题】:Is the second `^` in this alternative string redundant?这个替代字符串中的第二个“^”是多余的吗?
【发布时间】:2013-11-16 08:45:36
【问题描述】:

Introducing regular expression 的第 1 章中,我看到了这样的正则表达式:

^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$

我对此感到有些困惑,因为第二个 ^ 对我来说似乎是多余的。 | 在括号内分隔了两个备选方案\(\d{3}\)^\d{3}[.-]?,并且在括号外有一个^,我理解为匹配一行的开头,所以我认为第二个^^\d{3}[.-]? 中不必匹配行开头。有人对此有想法吗?

【问题讨论】:

  • 旁注:我强烈建议不要验证电话号码。有太多方面需要考虑。例如,如果有人需要给你一个国际号码怎么办?作为一名前任,我遇到了很多麻烦,因为美国公司无法理解北美以外的整个世界...... :-)
  • 你在什么书或参考书中看到这个?
  • @T.J.Crowder:完全同意。甚至不要让我开始了解邮政编码。
  • <rant> 因为这是一个“介绍”。可能有意添加它以明确正则表达式在某些情况下可能“困难”或“复杂”</rant>
  • 问得很好,很高兴看到。

标签: regex syntax parentheses


【解决方案1】:

是的,这对我来说也是多余的。第一个锚就足够了。

以下是我认为的分解方式:

^ ( \(\d{3}\) | ^\d{3}[.-]? )? \d{3} [.-]? \d{4} $

【讨论】:

    【解决方案2】:

    它看起来确实是多余的,但有一种可能的解释是有效的(尽管考虑到上下文是无意义的)。

    您只在问题中包含了正则表达式模式;您没有向我们展示的是是否使用了任何修饰符。

    如果您使用m 修饰符将正则表达式解析器切换到多行模式,那么^$ 锚点会改变它们的含义,以便它们匹配一行的开始和结束,以及整个字符串。

    因此,如果您的表达式使用m 修饰符,则附加的^ 会告诉它在该特定实例中查找额外的换行符。所以它会对表达式产生影响。

    但最终,看看你引用的表达式实际上做了什么,我怀疑这是否是预期的;正如您所假设的那样,它看起来好像基本上是一个错误。

    【讨论】:

    • 不错,不过,m
    【解决方案3】:

    是的,它在那里是多余的和无用的。好吧,它不会崩溃;)

    ^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$
    

    Debuggex Demo

    ^ 标记字符串/行的开始,不会产生任何结果,并且内部的指针也不会移动,因此表达式 ^^^^^^^^^^ 都是相等的。

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2021-03-25
      相关资源
      最近更新 更多