【问题标题】:Perl comprehensive phone number regex [duplicate]Perl综合电话号码正则表达式[重复]
【发布时间】:2019-02-03 18:57:57
【问题描述】:

我有一个文件,其中包含以下格式的电话号码:

(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}$/;

但我不确定这是否正确,或者如何在一个正则表达式中完成其余所有操作。谢谢!

【问题讨论】:

  • 对于困难的正则表达式,定义子正则表达式可能会有所帮助,例如$three_digits = qr/\d{3}/; 然后将它们组合到您列为另一个子正则表达式的每个案例中,然后将这 8 个正则表达式组合到最终的正则表达式中。

标签: regex perl


【解决方案1】:

给你

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

a demo on regex101.com


分解这是
\(?   # "(", optional
\d{3} # three digits
\)?   # ")", optional
[-. ] # one of "-", "." or " "
\d{3} # three digits
[-. ] # same as above
\d{4} # four digits

如果您愿意,您可以在正确的站点 (\b) 上添加单词边界,然后可能会过滤掉一些潜在的匹配项。

【讨论】:

  • 这行得通,只是它匹配了一个带有右括号但没有左括号的电话号码。前323) 729-9329
【解决方案2】:

您没有正确地转义括号并且没有用地转义不需要的连字符。您尝试创建的正则表达式是这样的,

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

解释:

  • ^ -
  • \(? - 可选的起始括号 (
  • \d{3} - 后跟三位数字
  • \)? - 可选右括号 )
  • [ .-] - 单个字符,空格或 .-
  • \d{3} - 后跟三位数字
  • [ .-] - 又是单个字符,可以是空格或.-
  • \d{4} - 后跟四位数字
  • $ - 字符串结束

Demo

【讨论】:

    【解决方案3】:

    您当前的正则表达式允许太多,因为它会在开头允许xxx-(xxx)。它也不处理任何. 或空格分隔的情况。您只想拥有三组数字,然后在第一组周围允许可选括号,您可以使用alternation 表示,然后您可以使用character classes 来指示您想要允许的分隔符集。

    此外,不要使用\d,因为它会匹配任何 unicode 数字。由于您可能只想允许 ASCII 数字,请使用字符类 [0-9](还有其他选项,但这是最简单的)。

    最后,$ 允许在字符串末尾使用换行符,因此请改用 \z,而后者不允许。确保如果您是从 chomp 他们的文件中读取这些内容,则它们不包含尾随换行符。

    这给我们留下了:

    qr/^(?:[0-9]{3}|\([0-9]{3}\))[-. ][0-9]{3}[-.][0-9]{4}\z/
    

    如果您想确保两个分隔符相同(如果第一个是 .-),则最容易在多个正则表达式检查中执行此操作(这些可能更宽松,因为我们已经验证了一般格式):

    if ($str =~ m/^[0-9()]+ /
        or $str =~ m/^[0-9()]+\.[0-9]{3}\./
        or $str =~ m/^[0-9()]+-[0-9]{3}-/) {
        # allowed
    }
    

    【讨论】:

    • 另外,当第一个分隔符是 .或 -,需要将第二个分隔符限制在该范围内
    • @ysth 我改用替代方法修复了第一个,并添加了一个用于检查第二个的选项(虽然可以在一个正则表达式中完成,但这会不必要地复杂)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多