我有一个正则表达式,我将用它来验证输入的号码是否采用标准的美国电话格式(即(###)### - ####)。我是正则表达式的新手,并且在确定每个角色的确切功能时仍然遇到一些麻烦。如果有人经历这件事/确认我理解我会非常感激。另外如果正则表达式错了,我显然想知道。
\ d *?(\ d \ d *?){10}
我认为发生了什么:
\ D *?(表示括号元字符的转义序列...不确定为什么\ D *?是必要的
\ d表示数字
\ d *?表示存在非数字字符( - ),后跟右括号。
{10}为10位数
我觉得非常不确定地解释这一点,就像我的理解是非常模糊的,为什么正则表达式是它的顺序等等。提前感谢帮助/解释。
修改
这似乎不是我想要的最好的正则表达式。另一种可能性是[(] [0-9] {3} [)] [0-9] {3} - [0-9] {4},但我被告知这会失败。我想我将不得不用正则表达式做更多的工作来解决这个问题。
答案 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]
表示0
到9
之间的任何字符,这意味着它将匹配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位数字或非数字