【问题标题】:Restricting digits in a regex match限制正则​​表达式匹配中的数字
【发布时间】:2017-09-01 02:11:17
【问题描述】:

tl;dr:如何在正则表达式中对特定标记设置计数约束。

(regex-exp){constraint:max 10 only digits}

我一直在尝试在文本块中查找电话号码。 Android 平台Patterns 类提供了合理的覆盖范围。但它有它的主要问题

  • 没有最小长度
  • 它没有最大长度

所以它实际上甚至匹配1234,并且当有像my phone numbers are +19447223311 872881122 这样的字符串时,它会将两个数字作为一个数字匹配。如果我们可以添加一个模式应该有数字 {7,12} 的约束,我猜它会解决这两个问题。尽管我尝试了很多都无法使其工作。 这是该模式的正则表达式。

public static final Pattern PHONE
    = Pattern.compile(                      // sdd = space, dot, or dash

            "(\\+[0-9]+[\\- \\.]*)?"        // +<digits><sdd>*

            + "(\\([0-9]+\\)[\\- \\.]*)?"   // (<digits>)<sdd>*

            + "([0-9][0-9\\- \\.]+[0-9])"); // <digit><digit|sdd>+<digit>

【问题讨论】:

  • 电话号码实际上没有最大长度。如果拼写某些东西,一些公司尤其会使用额外的数字,因为额外的数字会被忽略
  • @GabeSechan 也许是的。但就我而言,我想知道如何对正则表达式施加计数约束。 :-\
  • 另一个问题是 rehex 不是正确的工具。解析电话号码的语言不规范。
  • 重点不在实体“电话号码”上。如何根据特定令牌的计数向正则表达式添加约束

标签: java android regex regex-negation regex-lookarounds


【解决方案1】:

在 Android 中没有像 regex 约束 这样的东西,因为 PHONE 模式是预编译的,所以你也不能扩展它。

我会这样做:

Pattern constraint = Pattern.compile("\\+?\\d{7,12}");
Matcher constraint_matcher = constraint.matcher("I will be home by 12:30 and if you have anything " +
        "urgent call me at 901 101 0101, and my extension is 1021 +19447223311  872881122    ");

while (constraint_matcher.find()) {

    Matcher phone_number_matcher = Patterns.PHONE.matcher(constraint_matcher.group(0));

    if (phone_number_matcher.find()) {
        Log.d("MATCH", phone_number_matcher.group(0));
    }
}

给出这个结果:

09-15 16:20:34.277 10119-10119/com.example D/MATCH: +19447223311
09-15 16:20:34.277 10119-10119/com.example D/MATCH: 872881122

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 2017-02-27
    • 2017-06-07
    • 2014-09-27
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多