这个备用字符串中的第二个`^`是多余的吗?

时间:2013-11-05 13:02:14

标签: regex syntax parentheses

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

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

enter image description here

我有点困惑,因为第二个^看起来多余了。 |在括号内分隔两个备选\(\d{3}\)^\d{3}[.-]?,括号外有^,我理解为匹配一行的开头,所以我认为^中的第二个^\d{3}[.-]?没有必要匹配行开头。有没有人有这方面的想法?

3 个答案:

答案 0 :(得分:4)

它确实看起来多余,但有一种可能的解释是有效的(尽管在上下文中是非感性的)。

你只在问题中加入了正则表达式模式;你没有告诉我们的是是否使用了任何修饰语。

如果使用m修饰符将正则表达式解析器切换为多行模式,则^$锚点会更改其含义,以便它们与开头和结尾匹配<强>一行,以及整个字符串。

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

Regular expression visualization

Debuggex Demo

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