0

我有一个正则表达式,我将使用它来验证输入的号码是否采用标准的美国电话格式(即(###)###-####)。我是正则表达式的新手,但在弄清楚每个字符的确切功能时仍然遇到了一些麻烦。如果有人会逐个阅读/验证我的理解,我将非常感激。另外,如果正则表达式是错误的,我显然想知道这一点。

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

我认为正在发生的事情:
\D*?( 表示括号元字符的转义序列......不知道为什么 \D*? 是必要的
\d 表示数字
\D*? 表示有一个非数字字符( - ) 后跟右括号。
{10} 表示 10 位数字

我感到非常不确定如何解释这一点,就像我对为什么正则表达式的顺序等方面的理解非常模糊。在此先感谢您的帮助/解释。

编辑

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

4

3 回答 3

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]任何字符,这意味着它将匹配 0、1、2、3、4、5、6、7、8 或 9。在它之后添加使其匹配 3 个相似的字符类,并且由于该字符类仅包含数字,它将完全匹配 3 位数字。09{3}

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

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

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

也会起作用。如果您只是想查看电话号码是否与上述格式匹配,^我还建议您使用线路锚点。$这确保了字符串只有电话号码,没有别的。^匹配行首和$行尾。因此,正则表达式将变为:

^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$    

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

于 2013-07-09T17:29:11.050 回答
2

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

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

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

this is some bad text 1 and some more 2 and more 34567890
于 2013-07-09T17:29:15.340 回答
0

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

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

于 2013-07-09T17:34:24.913 回答