字符串的MIDDLE中的电话号码的正则表达式?

时间:2017-11-15 15:31:01

标签: java android regex

我已经看到有关电话号码认证的多个问题/答案,这很好,但是如果字符串严格是电话号码,所有这些都只能看到工作。就我而言,我们可能会收到这样的字符串:

  

"好的,我的号码是313-123-1234。现在让我们......"

电话号码的格式也会有所不同,所以我认为如果正则表达式可以处理" 10个数字的任何序列,忽略() - 。&#会更好34;

我尝试了一些不同的事情,包括:

"^((\\+\\d{1,2}|1)[\\s.-]?)?\\(?[2-9](?!11)\\d{2}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}$"

"/[0-9]{10}\\b/"

除其他外,如果它本身就是电话号码,那么它会再次发挥作用,但是当我在完整字符串上调用myStrig.matches(myRegex);时,它总是返回false。

话虽如此,是否存在本地解决方案,例如PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)可以使用上面提到的示例短语,或者什么是在这种情况下实际可行的正则表达式?

谢谢!

2 个答案:

答案 0 :(得分:-1)

尝试使用此模式:

String REGEX_PHONE_NUMBER_ALL = "(?:\\(\\d{3}\\)|\\d{3}[-]*)\\d{3}[-]*\\d{4}";

答案 1 :(得分:-1)

回答

所以,首先,Android的Pattern.matches(string, regex);似乎存在一个已知问题。相反,你应该使用:

    Pattern p = Pattern.compile(myRegex);
    Matcher m = p.matcher(myString);

    if(m.find()) {
        // true
    }

其次,我原来的正则表达式仍然不适用于我需要的所有场景,但是由于Wiktor Stribiżew建议,它现在有效。

他建议将^替换为(?<!\\w),将$替换为(?!\\w)

我的正则表达式现在看起来像这样:

(?<!\w)((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}(?!\w)

它有效!

作为参考,以下是我测试过的一些基本场景:

  • (313)456 3450
  • (313)456-3450
  • (313)-456-3450
  • 313-456-3450
  • 313.456.3450
  • 313 456 3450
  • 3134563450