1. 程式人生 > >關於正則表示式的一些常用困惑

關於正則表示式的一些常用困惑

前言:因為業務需要需要匹配出文件中特定的資料,並且賦值到到特定的陣列上面,
    所以需要用到特定的關係進行匹配,正則表示式是一個不錯的選擇,但是畢竟
    是普通人所以沒辦法!習慣性遺忘...說句實話還是用的少的原因,下面簡單的
    複習下為了以後自己看,簡單的做下筆記,雖然今天的事蠻多的,還有一道演算法
    沒有寫完,我會努力的
正則表示式
基本概念:正則表示式本質上是一個字串,用於格式的驗證,匹配,查詢,替換等,為了與
        普通的字串進行區分,該字串通常使用"^"開頭,使用"&"結尾,可以省略。

常用的規則:
-[abc]   - 表示可以出現a,b以及c.
-[^abc]  - 表示可以出現任何字元除a,b,c.
-[a-zA-Z]- 表示可以出現任何字母,也就是a到z和A到Z之間的任意字元.

-\d -表示可以出現任何數字,相當於[0-9].
-\D -表示可以出現任何非數字,相當於[^0-9].
-\s -表示可以出現任何空白字元,相當於[\t\n\xob\f\r].
-\S -表示可以出現任何非空白字元,相當於[^\s].
-\w -表示可以出現單詞字母,相當於[a-zA-Z_0-9],就是字母數字下劃線.
-\W -表示可以出現任何非單詞字元,相當於[^\w].

-X? -表示X可以出現一次或者一次也沒有,也就是可以出現0~1次.
-X* -表示X可以出現零次或多次,也就是可以去出現0~n次.
-X+ -表示X可以出現一次或者多次,也就是可以出現1~n次.
-X{n}   -表示X恰好出現n次.
-X{n,}  -表示X可以出現至少n次,也就是 >=n次
-X{n,m} -表示X可以出現至少n次,但是不超過m次,也就是 >=n次並且<=m次

提示:有的時候String類中的split()方法可以進行字串拆分.
下面寫幾個例項:
1) 描述銀行卡密碼的規則:要求必須是數字,而且必須是6位
    String reg = "^\d{6}&";
    但是很遺憾這樣子寫是錯誤的,因為在Java中存在一個轉義問題正確的寫法如下:
    String reg = "^\\d{6}&";

2) 描述使用者名稱的規則,要求由6 ~ 8位數字字母以及下劃線組成
    String reg = "^\\w{6,8}&";

3) 描述座機號碼的規則,要求3~4位區號由數字組成、-、7~8位數字組成的號碼
    String reg = "^\\d{3,4}[-]{1}\\d{7,8}&";

4) 描述手機號碼的規則,要求11位數字組成,第一位必須是1
    String reg = "^[1]{1}\\d{10}";

5) 描述身份證號的規則,要求總共18位,前面17位必須是數字,後面1位可以是數字也可以X
    String reg = "^\\d{17}\\[0-9x]{1}&";
6) 描述郵箱的規則,要求郵箱名必須由數字字母下劃線組成,至少一位,@,
   分析:常見的郵箱字尾為@qq.com,@126.com,@org.com反正我就見到過這三種   
    String reg = "^\\w+[@]{1}[0-9a-zA-Z]{2,4}(.com.cn.com.cn|.org)$";

提示:如果需要過濾或者替換...上面說過了.忘了的自己去翻,號我自己翻回去看看一般用到了String裡
面的方法.
以下方法全部參考自JDK api 1.6(1.8還沒有追,更別說1.9了...)

a.如果判斷是否符合特定的格式
    String str = "
[email protected]
"; //需要驗證的字串 String reg = "^\\w+[@]{1}[0-9a-zA-Z]{2,4}(.com|.cn|.com.cn|.org)$";//驗證的格式 boolean boo = str.matches(reg); 呼叫此方法的 str.matches(regex) 形式與以下表達式產生的結果完全相同: Pattern.matches(regex, str) 引數: regex - 用來匹配此字串的正則表示式 返回: 當且僅當此字串匹配給定的正則表示式時,返回 true 附加匹配資訊: 我們在工作中難免會碰到漢字的可能性,查了下資料發現匹配的公式是這個樣子的: [\u4E00-\u9FA5] 需要注意的一點是前後並不能加 '^','&'或者是兩個全家,至於原因以後我會補上 下面補充一個例子: 7) String str = "規劃路線的座標 x541y440"; String reg = "[\u4E00-\u9FA5]+\\s+\\w+"; if(str.matches(reg)){ System.out.println("匹配成功!"); }else{ System.out.println("匹配失敗!"); } 經過驗證是沒有問題的. 我複習正則表示式的目的 以下是部分驗證程式碼: String str1 = "12-01 21:"; //暫時先來驗證這一段字串 String str2 = "12-01"; String str3 = "12-01 21:34:36.401"; String str4 = "12-01 21:34:36.401 719-719/"; String str5 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out:"; String str6 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out: 規劃路線的座標 x577y96"; /** 根據我的分析是這個樣子的**/ String regex = "^\\d+[-]+\\d+\\s+\\d+[:]+"; String regex3 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+"; String regex4 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+"; String regex5 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+"; String regex6 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+\\w+"; if(str6.matches(regex6)){ System.out.println(1); }else{ System.out.println(0); } 下面根據String提供的方法split進行分割 public String[] split(String regex)根據給定正則表示式的匹配拆分此字串。 該方法的作用就像是使用給定的表示式和限制引數 0 來呼叫兩引數 split 方法。因此,所得陣列中不包括結尾空字串。 例如,字串 "boo:and:foo" 使用這些表示式可生成以下結果: Regex 結果 : { "boo", "and", "foo" } o { "b", "", ":and:f" } 引數: regex - 定界正則表示式 也就是把跟表示式相同的部分全部過濾掉了,且返回的型別是一個String[]很有意思 下面是拆分之後的程式碼 // 先來驗證一部分字串 String str1 = "12-01 21:"; //暫時先來驗證這一段字串 String str2 = "12-01"; String str3 = "12-01 21:34:36.401"; String str4 = "12-01 21:34:36.401 719-719/"; String str5 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out:"; String str6 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out: 規劃路線的座標 x577y96"; /** 根據我的分析是這個樣子的**/ String regex = "^\\d+[-]+\\d+\\s+\\d+[:]+"; String regex3 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+"; String regex4 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+"; String regex5 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+ \\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+"; String regex6 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+ \\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+\\w+"; /** 根據需求知道我需要擷取的是後面的x和y那麼如下:**/ String regex7 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+ \\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+"; if(str6.matches(regex6)){ System.out.println(1); }else{ System.out.println(0); } String[] strValue = str6.split(regex7); for(int i = 0; i < strValue.length; i++){ if(!"".equals(strValue[i])){ System.out.println(strValue[i]); } } 輸出結果為: 1 x577y96 是沒有問題的,感覺收穫蠻大的.爭取一週更新兩篇部落格. 人生為棋,我願為卒,行動雖慢,可誰見我都會後退一步...