如何去除正则表达式?

时间:2014-02-21 11:00:43

标签: regex

正则表达式中是否有范围概念?

在此

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

用于匹配10位数的北美电话号码,带或不带括号,连字符或点(我理解reg。表达式时的另一个尝试)

我无法理解,当你去分解这样的表达时,你怎么去理解它?你怎么知道这个范围是什么?

Okey,它以^开头,以$两行结束。 在结束之前,有一个三位数字,后跟一个可选的点或连字符,以及一个四位数字。那部分很清楚。

这样就离开了我们

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

插入符号的目的是什么,如果我们在开头已有一个?

这又告诉我们的是,前三位数字可以在括号中,还是没有后跟点或连字符?

我正在试图找出一种系统的方式,当我在某个地方找到一个未知的表达时,如何去构建它并看看它做了什么?


编辑:根据其他人在评论中的建议,第二个插入符号似乎是不必要的。在RegexPal中对其进行测试,确认了以下

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

^(123)456.7890
^123.456.7890
^456.7890

但不是

^   (123)456.7890
^   123.456.7890

(插入符号指定行的开头)。任何人都可以想到需要第二个插入符号的例子吗?

1 个答案:

答案 0 :(得分:0)

现在回答这个问题,因为看起来你有一些未解决的问题。

  

正则表达式中是否有范围概念?

     

有人会想到需要第二个插入符号的例子吗?

是的,有点,是的。让我们从第二个开始。

多个插入

你可以有多个插入符号,这可能非常有用。

这是一个简单的例子(demo here):

(?<=^|\b)dog|^cat

这个正则表达式匹配:  1. dog,如果前瞻(?<=^|\b)可以成功断言它位于一行的开头,或者前面是一个单词边界(因此,dog位于hotdog不会匹配),或者......  2. cat,如果它在一行的开头。

在这个特定示例中,您可以重新排列分组以将其重写为^(?:dog|cat)|\bdog,但这不是重点。他们指出,多个插入符号是可能的并且可能有用:在正则表达式中的几个点处,您可能想要断言引擎当前位于字符串的开头(^锚点所做的那样)。

<强>范围

您想询问插入符号的“范围”。任何标记t的范围是引擎当前所在的字符串中的确切位置p。引擎只能匹配那里的令牌。如果它在该位置无法匹配t,并且没有可能的回溯,则匹配失败。接下来,引擎尝试从字符串中开始匹配尝试的位置开始的一个位置的全新匹配。 (通常这与p无关,除非t是模式的第一个标记。)在该匹配尝试期间,如果引擎设法匹配t之前的所有标记,则再次t的范围将是当时字符串中引擎的位置。该位置可能与先前的p相同或不同。

希望这会有所帮助,如果有任何疑问,请与我联系。 :)