正则表达式匹配至少有n个数字的非字母字符序列

时间:2011-03-11 16:09:20

标签: java regex

我正在寻找一个在Java(java.util.regex.Pattern)中使用的正则表达式,它将与电话号码的通用形式相匹配。我已将此指定为:

一系列至少8个非字母字符,其中至少8个字符为数字。

例如,具有正匹配的字符串文字将是:

“电话:(011)1234-1234 blah blah blah”

但是以下字符串文字 匹配:

“Fot 3 ..... 3 blah blah blah blah”

我已经匹配至少8个非字母字符的序列

Pattern.compile("[^\\p{L}]{8,}");

如何在指定[\ d] {8,}

的正则表达式中添加“和”/“结合限制”

我在stackoverflow上看过这篇文章:

Regular Expressions: Is there an AND operator?

关于“anding”正则表达式,但我似乎无法让它工作。

任何帮助或建议,非常欢迎:

西蒙

4 个答案:

答案 0 :(得分:2)

如果您要搜索非结构化文档中的电话号码,即电话号码可以用多种方式表示(有或没有intl前缀,区号周围的括号,破折号,可变数字的数字,随机分组)白色空间等),你可能会得到许多天真看起来像电话号码但不是(例如在网络上)的数字,忘记使用正则表达式,认真。

编写自己的解析器要好得多。基本上,这会逐步通过您的文本一个字符,您可以添加任何您喜欢的规则。这种方法还可以更容易地匹配实际的真实电话号码(例如有效的国际或地区代码,或本地或国家交易所可能具有的其他规则),从而减少误报。我知道自己这样做可以在超过一百万个网站上匹配英国数字:10或11位数字的一般正则表达式加上一些其他基本规则与不可思议的非电话号码相匹配。

编辑:如果您要与网络文档进行匹配,您还会遇到电话号码不是连续的自由文本但包含html标记的问题。它发生了:))

答案 1 :(得分:1)

^(?=(?:.*[^\\p{L}\\d]){8,})(?=(?:.*\\d){8,})如果非字母不能是数字

^(?=(?:.*\\P{L}){8,})(?=(?:.*\\d){8,})如果非字母可以是数字

修改:评论/排除空白修饰符/x

如果非字母不能是数字

^                          # beginning of string
     (?=                         # Start look ahead assertion (consumes no characters)
          (?:                       # Start non-capture group
              .*                        # 0 or more anychar (will backtrack to match next char)
              [^\pL\d]                  # character: not a unicode letter nor a digit
          ){8,}                     # End group, do group 8 or more times
     )                           # End of look ahead assertion
     (?=                         # Start new look ahead (from beginning of string)
          (?:                        # Start grouping
              .*                         # 0 or more anychar (backtracks to match next char)
              \d                         # a digit
          ){8,}                      # End group, do 8 or more times (can be {8,}? to minimize match)
     )                           # End of look ahead

如果非字母可以为数字

^                       # Same form as above (except where noted)
    (?=                 #  ""
         (?:            #  ""
             .*         
             \PL        # character: not a unicode letter
         ){8,}
    )
    (?=
         (?:
             .*
             \d
         ){8,}
    )

答案 2 :(得分:0)

我会在没有的情况下使用正则表达式。非正则表达式代码很简单。

答案 3 :(得分:-1)

这样的事情怎么样:

import java.util.regex.*;

class Test {
    public static void main(String args[]) {
        for (String tel : new String[]{
            "Tel: (011) 1234-1234 blah blah blah",
            "Tel: (011) 123-1 blah blah blah"
        }) {
            System.err.println(tel + " " + (test(tel) ?
                "matches" : "doesn't match"));
        }
    }

    public static boolean test(String tel) {
        return Pattern.compile("^(\\D*(\\d+?)\\D*){8,}$").matcher(tel).matches();
    }
}

将产生:

Tel: (011) 1234-1234 blah blah blah matches
Tel: (011) 123-1 blah blah blah doesn't match