2011-03-11 61 views
1

我正在寻找一个正则表达式在Java(java.util.regex.Pattern中)使用,将匹配一个电话号码的一种推广形式。我已经指定为:正则表达式匹配的非字母字符序列有至少n个数字

至少8个非字母字符的序列,至少8个字符是数字。

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

“电话:(011)1234年至1234年等等等等等等”

然而下列串文字将比赛:

“的FOT3 ..... 3等等等等等等”

我得尽可能匹配荷兰国际集团至少8非字母字符

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

的序列如何添加一个“和” /“conjuncive限制”到该正则表达式指定[\ d] {8,}

我看到这张贴在计算器:

Regular Expressions: Is there an AND operator?

关于“安定”正则表达式,但我似乎无法得到它的工作。

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

西蒙

+1

一个正则表达式匹配的电话号码是非常棘手的。你最好写个扫描仪/解析器来做这件事。您将获得更好的覆盖率和更少的误报。 – 2011-03-11 16:14:35

+0

如果你有一个可以通过使用正则表达式解决的问题,你现在有两个问题:) – DaveH 2011-03-11 16:16:09

回答

0

我会使用正则表达式做没有。非正则表达式代码很简单。

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,} 
    ) 
+0

谁把大括号括在一个简单的'\ pL'或'\ PL'?这使得那些更长的时间输入和阅读混乱。由于Java人似乎永远不会对“Pattern.COMMENTS”感到困扰,因此他们需要获得所有的帮助。 – tchrist 2011-03-11 21:22:51

+1

@tchrist - 包含注释。怎么样? – sln 2011-03-11 23:37:28

2

如果您正在搜索非结构化文档中的电话号码,即其中的电话号码可以在任何数量的方式来表达(有或没有国际长途前缀,围绕地区代码的括号,破折号,可变的数字位数,随机分配的空白等),以及在哪里你可能会得到很多天真的电话号码,但不是(例如在网络上) ,认真地忘记使用正则表达式。

你最好写自己的解析器。基本上,这个步骤通过你的文本一次一个字符,你可以添加任何你喜欢的规则。这种方法也使得与实际的真实电话号码(例如有效的国际或地区代码,或本地或国家交换所可能具有的其他规则)相匹配并且减少误报更容易。通过这样做,我自己可以在超过100万个商业网站上匹配英国数字:10或11位数字的一般正则表达式加上一些其他基本规则与非常多的非电话号码相匹配。

编辑:此外,如果你是与网页文件相匹配,你也有电话号码不是连续的自由文本,但包含HTML标记的问题。它发生:)

-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 
相关问题