解码正则表达式...我知道它的功能是什么,但我想要准确理解发生了什么

时间:2013-07-09 17:23:52

标签: regex

我有一个正则表达式,我将用它来验证输入的号码是否采用标准的美国电话格式(即(###)### - ####)。我是正则表达式的新手,并且在确定每个角色的确切功能时仍然遇到一些麻烦。如果有人经历这件事/确认我理解我会非常感激。另外如果正则表达式错了,我显然想知道。

\ d *?(\ d \ d *?){10}

我认为发生了什么:
\ D *?(表示括号元字符的转义序列...不确定为什么\ D *?是必要的 \ d表示数字
\ d *?表示存在非数字字符( - ),后跟右括号。
{10}为10位数

我觉得非常不确定地解释这一点,就像我的理解是非常模糊的,为什么正则表达式是它的顺序等等。提前感谢帮助/解释。

修改

这似乎不是我想要的最好的正则表达式。另一种可能性是[(] [0-9] {3} [)] [0-9] {3} - [0-9] {4},但我被告知这会失败。我想我将不得不用正则表达式做更多的工作来解决这个问题。

3 个答案:

答案 0 :(得分:3)

\D匹配任何非数字字符。

*表示前一个字符重复0次或更多次。

*?表示前一个字符重复0次或更多次,但直到匹配正则表达式中的后续字符。这可能在开始时有点困难,但在你的正则表达式中,下一个字符是\d,这意味着\D*?将匹配最少量的字符,直到下一个\d字符。

( ... )是一个捕获组,也用于对事物进行分组。例如{10}表示前一个字符或组完全重复10次。

现在,\D*?(\d\D*?){10}将完全匹配10个数字,从非数字字符开始,如果存在,则在数字之间使用非数字字符。

[(][0-9]{3}[)] [0-9]{3}-[0-9]{4}

这个正则表达式更好一点,因为它不只是接受任何东西(比如第一个正则表达式)并且将匹配格式(###) ###-####(注意空格是正则表达式中的一个字符!)。

这里介绍的新东西是方括号。这些代表字符类。 [0-9]表示09之间的任何字符,这意味着它将匹配0,1,2,3,4,5,6,7,8或9.添加{{ 1}}之后它使它匹配3个相似的字符类,并且因为这个字符类只包含数字,所以它将恰好匹配3个数字。

字符类可用于转义某些字符,例如{3}((注意我之前提到过它们用于捕获组或分组),因此,)[(]是文字[)](,而不是用于捕获/分组。

您也可以使用反斜杠())来转义字符。因此:

\

也会奏效。如果您只是想查看电话号码是否与上述格式匹配,我还建议您使用行锚\([0-9]{3}\) [0-9]{3}-[0-9]{4} ^。这可以确保字符串只包含电话号码,而不包含任何其他内容。 $匹配行的开头,^匹配行的结尾。因此,正则表达式将成为:

$

但是,我不知道美国不同格式的电话号码的所有组合,因此如果你有不同的电话号码格式,这个正则表达式可能需要一些调整。

答案 1 :(得分:2)

\ D是“不是数字”; \ d是“数字”。考虑到这一点:

匹配零个或多个非数字,然后匹配一个数字和任意数量的非数字字符10次。如果格式正确,这实际上不会验证该数字,只是它包含10位数。我怀疑正则表达式首先不是你想要的。

例如,以下内容将匹配您的正则表达式:

this is some bad text 1 and some more 2 and more 34567890

答案 2 :(得分:0)

\ D匹配不是数字的字符 *重复前一项0次或更多次 ?找到第一次出现 \ d匹配一个数字

所以你的小组匹配10位数字或非数字