这个问题已经在这里有一个答案:
我有一个包含以下格式的电话号码文件:
(xxx) xxx.xxxx
(xxx).xxx.xxxx
(xxx) xxx-xxxx
(xxx)-xxx-xxxx
xxx.xxx.xxxx
xxx-xxx-xxxx
xxx xxx-xxxx
xxx xxx.xxxx
我必须分析这些的电话号码,只有那些格式的文件,并将其输出到一个单独的文件。我用perl,所以到目前为止,我有什么,我认为有两个这些数字的有效的正则表达式
my $phone_regex = qr/^(\d{3}\-)?(\(\d{3}\))?\d{3}\-\d{4}$/;
但我不知道这是正确的,还是怎么办,其余全部在一个正则表达式。谢谢!
干得好
\(?\d{3}\)?[-. ]\d{3}[-. ]\d{4}
\(? # "(", optional
\d{3} # three digits
\)? # ")", optional
[-. ] # one of "-", "." or " "
\d{3} # three digits
[-. ] # same as above
\d{4} # four digits
如果你愿意,你可以在正确的网站(\b
),一些潜在的匹配可以被过滤掉,然后在添加单词边界。
你也没能逃脱括号正确,并已白白逃脱它不需要连字符。您要创建的正则表达式是这样的,
^\(?\d{3}\)?[ .-]\d{3}[ .-]\d{4}$
说明:
^
- \(?
- 紧随其后的三个数字(
- 可选右括号\d{3}
\)?
- 单个字符空格或)
或[ .-]
.
- 紧随其后的三个数字-
- 再一个字符空格或\d{3}
或[ .-]
.
- 随后四位数-
- 字符串的结束\d{4}
您当前的正则表达式允许太多,因为这将使$
开头。它也不会处理任何的Demo或空格分隔的情况。你想拥有的只有三组数字,然后让身边,你可以使用一个xxx-(xxx)
第一套可选的括号,然后您可以利用.
的指示设置要允许分离的。
此外,不要使用alternation,因为它会匹配任何Unicode数字。既然你可能只希望允许ASCII数字,使用字符类character classes(还有其他的选择,但是这是最简单的)。
最后,\d
允许在字符串的结尾换行,所以使用[0-9]
代替它没有。确保,如果你是从你$
他们,使他们不包含尾随的换行符文件阅读这些。
这给我们留下了:
\z
如果你想确保这两个分离器是相同的,如果第一个是chomp或qr/^(?:[0-9]{3}|\([0-9]{3}\))[-. ][0-9]{3}[-.][0-9]{4}\z/
,它是最容易做到这一点在多个正则表达式检查(这些可以更宽松,因为我们已经验证的一般格式):
.