JAVA中Regex總結

來源:互聯網
上載者:User

標籤:

一、Regex基礎知識

 

1.1 句點符號
       假設你在玩英文拼字遊戲,想要找出三個字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結束。另外,假設有一本英文字典,你可以用Regex搜尋它的全部內容。要構造出這個Regex,你可以使用一個萬用字元——句點符號“.”。這樣,完整的運算式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”,還有其他許多無意義的組合。這是因為句點符號匹配所有字元,包括空格、Tab字元甚至分行符號:

 

 

1.2 方括弧符號

 

 

為瞭解決句點符號匹配範圍過於廣泛這一問題,你可以在方括弧(“[]”)裡面指定看來有意義的字元。此時,只有方括弧裡面指定的字元才參與匹配。也就是說,Regex“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因為在方括弧之內你只能匹配單

個字元:

 

1.3 “或”符號

      如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那麼,你可以使用“|”操作符。“|”操作符的基本意義就是“或”運算。要匹配“toon”,使用“t(a|e|i|o|oo)n”Regex。這裡不能使用方擴號,因為方括弧只允許匹配單個字元;這裡必須使用圓括弧“()”。圓括弧還可以用來分組。

 

1.4 表示匹配次數的符號

下表顯示了Regex的文法:

表 1.1 Regex文法

 

元字元 說明
. 匹配任何單個字元。例如Regex“b.g”能匹配如下字串:“big”、“bug”、“b g”,但是不匹配“buug”。 
$ 匹配行結束符。例如Regex“EJB$”能夠匹配字串“I like EJB”的末尾,但是不能匹配字串“J2EE Without EJBs!”。 
^ 匹配一行的開始。例如Regex“^Spring”能夠匹配字串“Spring is a J2EE framework”的開始,但是不能匹配“I use Spring in my project”。
* 匹配0至多個在它之前的字元。例如Regex“zo*”能匹配“z”以及“zoo”;Regex“.*”意味著能夠匹配任一字元串。
/ 轉義符,用來將元字元當作普通的字元來進行匹配。例如Regex/$被用來匹配貨幣符號,而不是行尾;Regex/.用來匹配點字元,而不是任何字元的萬用字元。
[] 匹配括弧中的任何一個字元。例如Regex“b[aui]g”匹配bug、big和bug,但是不匹配beg。可以在括弧中使用連字號“-”來指定字元的區間來簡化表示,例如Regex[0-9]可以匹配任何數字字元,這樣Regex“a[]c”就可以匹配“a0c”、“a1c”、“a2c”等字串;還可以制定多個區間,例如“[A-Za-z]”可以匹配任何大小寫字母。還有一個相配合使用的元字元“^”,用在這裡並不像前邊的那個“^”一樣表示匹配行開始,而是表示“排除”,要想匹配除了指定區間之外的字元,就可以在左邊的括弧和第一個字元之間使用^字元,例如“[^163A-Z]”將能偶匹配除了1、6、3和所有大寫字母之外的任何字元。
( ) 將 () 之間括起來的運算式定義為“組”(group),並且將匹配這個運算式的字元儲存到一個臨時地區,這個元字元在字串提取的時候非常有用。
| 將兩個匹配條件進行邏輯“或”運算。‘z|food‘ 能匹配 "z" 或 "food"。‘(z|f)ood‘ 則匹配"zood" 或 "food"。
+ 匹配前面的子運算式一次或多次。例如Regex9+匹配9、99、999等。
? 匹配前面的子運算式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。此元字元還有另外一個用途,就是表示非貪婪模式比對,後邊將有介紹
{n} 匹配確定的 n 次。例如,“e{2}”不能匹配“bed”中的“d”,但是能匹配“seed”中的兩個“e”。
{n,} 至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配“seeeeeeeed”中的所有“e”。
{n,m} 最少匹配 n 次且最多匹配 m 次。“e{1,3}”將匹配“seeeeeeeed”中的前三個“e”。

 

    假設我們要在文字檔中搜尋美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的Regex一所示。在Regex中,連字號(“-”)有著特殊的意義,它表示一個範圍,比如從0到9。因此,匹配社會安全號碼中的連字號號時,它的前面要加上一個逸出字元“/”。

      假設進行搜尋的時候,你希望連字號號可以出現,也可以不出現——即,999-99-9999和999999999都屬於正確的格式。這時,你可以在連字號號後面加上“?”數量限定符號。

      美國汽車牌照的一種格式是四個數字加上二個字母。它的Regex前面是數字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。

 

1.5 “否”符號

      “^”符號稱為“否”符號。如果用在方括弧內,“^”表示不想要匹配的字元。例如,圖四的Regex匹配所有單詞,但以“X”字母開頭的單詞除外。

1.6 圓括弧和空白符號

     “/s”符號是空白符號,匹配所有的空白字元,包括Tab字元。如果字串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個圓括弧建立一個組,然後用ORO API提取出它的值。

1.7 其它符號

     為簡便起見,你可以使用一些為常見Regex建立的快捷符號。如以下所示:

    

/t:定位字元,等同於/u0009/n:分行符號,等同於/u000A/d:代表一個數字,等同於[0-9]/D:代表非數字,等同於[^0-9]/s:代表分行符號、Tab定位字元等空白字元/S:代表非空白字元/w:字母字元,等同於[a-zA-Z_0-9]/W:非字母字元,等同於[^/w]例如,在前面社會安全號碼的例子中,所有出現“[0-9]”的地方我們都可以使用“/d”。 以下是我整理出來的程式:供參考:[java] view plaincopy 
  1. package org.luosijin.test;  
  2.   
  3. import java.util.regex.Matcher;  
  4. import java.util.regex.Pattern;  
  5.   
  6. /** 
  7.  * Regex 
  8.  * @version V5.0 
  9.  * @author 羅嗣金 
  10.  * @date   2009-11-9 
  11.  */  
  12. public class Regex {  
  13.   
  14.     /** 
  15.      * @param args 
  16.      * @author 羅嗣金 
  17.      * @date 2009-11-9 下午11:27:28 
  18.      */  
  19.   
  20.     public static void main(String[] args) {  
  21.         Pattern pattern = Pattern.compile("b*g");  
  22.         Matcher matcher = pattern.matcher("bbg");  
  23.         System.out.println(matcher.matches());  
  24.         System.out.println(pattern.matches("b*g","bbg"));  
  25.         //驗證郵遞區號  
  26.         System.out.println(pattern.matches("[0-9]{6}", "200038"));  
  27.         System.out.println(pattern.matches("//d{6}", "200038"));  
  28.         //驗證電話號碼  
  29.         System.out.println(pattern.matches("[0-9]{3,4}//-?[0-9]+", "02178989799"));  
  30.         getDate("Nov 10,2009");  
  31.         charReplace();  
  32.         //驗證身份證:判斷一個字串是不是社會安全號碼碼,即是否是15或18位元字。  
  33.         System.out.println(pattern.matches("^//d{15}|//d{18}$", "123456789009876"));  
  34.         getString("D:/dir1/test.txt");  
  35.         getChinese("welcome to china,江西奉新,welcome,你!");  
  36.         validateEmail("[email protected]");  
  37.     }  
  38.     /** 
  39.      * 日期提取:提取出月份來 
  40.      * @param str 
  41.      * @author 羅嗣金 
  42.      * @date 2009-11-9 下午11:56:06 
  43.      */  
  44.     public static void getDate(String str){  
  45.         String regEx="([a-zA-Z]+)|//s+[0-9]{1,2},//s*[0-9]{4}";  
  46.         Pattern pattern = Pattern.compile(regEx);  
  47.         Matcher matcher = pattern.matcher(str);  
  48.         if(!matcher.find()){  
  49.             System.out.println("日期格式錯誤!");  
  50.             return;  
  51.         }  
  52.         System.out.println(matcher.group(1));   //分組的索引值是從1開始的,所以取第一個分組的方法是m.group(1)而不是m.group(0)。  
  53.     }  
  54.     /** 
  55.      * 字元替換:本執行個體為將一個字串中所有包含一個或多個連續的“a”的地方都替換成“A”。 
  56.      *  
  57.      * @author 羅嗣金 
  58.      * @date 2009-11-10 上午12:06:03 
  59.      */  
  60.     public static void charReplace(){  
  61.         String regex = "a+";  
  62.         Pattern pattern = Pattern.compile(regex);  
  63.         Matcher matcher = pattern.matcher("okaaaa LetmeAseeaaa aa booa");  
  64.         String s = matcher.replaceAll("A");  
  65.         System.out.println(s);  
  66.     }  
  67.     /** 
  68.      * 字串提取 
  69.      * @param str 
  70.      * @author 羅嗣金 
  71.      * @date 2009-11-10 上午12:20:48 
  72.      */  
  73.     public static void getString(String str){  
  74.         String regex = ".+/(.+)$";  
  75.         Pattern pattern = Pattern.compile(regex);  
  76.         Matcher matcher = pattern.matcher(str);  
  77.         if(!matcher.find()){  
  78.             System.out.println("檔案路徑格式不正確!");  
  79.             return;  
  80.         }  
  81.         System.out.println(matcher.group(1));  
  82.     }  
  83.     /** 
  84.      * 中文提取 
  85.      * @param str 
  86.      * @author 羅嗣金 
  87.      * @date 2009-11-10 上午12:27:17 
  88.      */  
  89.     public static void getChinese(String str){  
  90.         String regex = "[//u4E00-//u9FFF]+";//[//u4E00-//u9FFF]為漢字   
  91.         Pattern pattern = Pattern.compile(regex);  
  92.         Matcher matcher = pattern.matcher(str);  
  93.         StringBuffer sb = new StringBuffer();  
  94.         while(matcher.find()){  
  95.             sb.append(matcher.group());  
  96.         }  
  97.         System.out.println(sb);  
  98.     }  
  99.     /** 
  100.      * 驗證Email 
  101.      * @param email 
  102.      * @author 羅嗣金 
  103.      * @date 2009-11-10 上午12:34:50 
  104.      */  
  105.     public static void validateEmail(String email){  
  106.         String regex = "[0-9a-zA-Z][email protected][0-9a-zA-Z]+//.[0-9a-zA-Z]+";  
  107.         Pattern pattern = Pattern.compile(regex);  
  108.         Matcher matcher = pattern.matcher(email);  
  109.         if(matcher.matches()){  
  110.             System.out.println("這是合法的Email");  
  111.         }else{  

JAVA中Regex總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.