2011-03-11 59 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 
相關問題