【问题标题】:Regular Expression for one of two phone number formats [duplicate]两种电话号码格式之一的正则表达式[重复]
【发布时间】:2023-03-12 02:44:02
【问题描述】:

我只想匹配以下任一格式:

(444) 444-4444

444-444-4444

这里有两个接近的表达式:

((?:(\(\d{3}\)\s)|(\d{3}-))\d{3}-\d{4})

((\(\d{3}\)\s)|(\d{3}-))\d{3}-\d{4}

两者都在说,使用(###)###-,然后添加###-####

问题是这两个示例都匹配 (###-###-#### 和其他恰好包含我想要的字符串之一的模式。

如何确保只有完全匹配字符串?

我在一开始就看到了一些带有插入符号的例子,但我还没有让它起作用。我正在研究红宝石。谢谢。

【问题讨论】:

  • 使用\A 匹配字符串的开头,使用\z 匹配字符串的最后(或\Z 匹配字符串的结尾)。

标签: java ruby regex


【解决方案1】:
input = ['(444) 444-4444', '444-444-4444', '444 444-4444']
input.grep /\A(\(\d{3}\) |\d{3}-)\d{3}-\d{4}\z/
#⇒ [
#   [0] "(444) 444-4444",
#   [1] "444-444-4444"
#  ]

【讨论】:

  • 谢谢!这很棒。请问你为什么不用在\(\d{3}\)后面指定空格\s?留个空位就够了吗?我还在学习。我没有足够的信誉投票,但我选择了这个作为答案。
  • 在这个特定的上下文中只是一个空白空间,\s 也是如此。
【解决方案2】:

你可以使用:

public static void main(String[] args) {
    System.out.println("Pn (444) 444-4444 : " + validatePhoneNumber("(444) 444-4444"));
    System.out.println("Pn 444-444-4444 : " + validatePhoneNumber("444-444-4444"));
}

private static boolean validatePhoneNumber(String phoneNo) {
    if (phoneNo.matches("\\d{3}[-\\.\\s]\\d{3}[-\\.\\s]\\d{4}")) {
        return true;
    } else return phoneNo.matches("\\(\\d{3}\\) \\d{3}-\\d{4}");
}

【讨论】:

    【解决方案3】:
    /^(((\(){1}(\d){3}(\){1}))(\ )(\d){3}(\-)(\d){4}|((\d){3}(\-)(\d){3}(\-)(\d){4}))/gm
    

    使用这个正则表达式,我已经测试过了,它适用于两种格式

    您可以使用本网站进行进一步测试 http://www.regextester.com/6

    【讨论】:

    • 当我测试这个时,它仍然匹配其他格式。如:(444)-444-4444(444-444-4444
    • 嗯。重新编辑我的答案现在适合:(444) 444-4444 444-444-4444
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 2023-03-21
    • 2023-03-11
    • 2014-03-02
    • 1970-01-01
    • 2019-05-23
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多