主題:Java中Regex的使用

來源:互聯網
上載者:User

在Java中,我們為了尋找某個給定字串中是否有需要尋找的某個字元或者子字串、或者對字串進行分割、或者對字串一些字元進行替換/刪除,一般會通過if-else、for 的配合使用來實現這些功能 。如下所示:

Java代碼

  1. public class Test{  
  2.   public static
    void main(String args[]) {  
  3.          String str="@Shang Hai Hong Qiao Fei Ji Chang";  
  4.          boolean rs =
    false;  
  5.          for(int i=0;i<str.length();i++){  
  6.                 char z=str.charAt(i);    
  7.                 if('a' == z ||
    'F' == z) {  
  8.                        rs  = true;  
  9.                        break;  
  10.                 }else{  
  11.                        rs= false;  
  12.                 }  
  13.          }     
  14.          System.out.println(rs);  
  15.        }  
public class Test{  public static void main(String args[]) {         String str="@Shang Hai Hong Qiao Fei Ji Chang";         boolean rs = false;         for(int i=0;i<str.length();i++){                char z=str.charAt(i);                  if('a' == z || 'F' == z) {                       rs  = true;                       break;                }else{                       rs= false;                }         }            System.out.println(rs);       }}

     這種方法使用簡單直觀,但是 難以解決複雜的工作,而且代碼量也會增加很多,不利於維護。

      這時,我們可以使用Regex來實現這些功能,而且代碼簡單易維護。下面就來介紹了Java中對字串的Regex的幾個常用的功能,具體情況如下所示(其中用到了java.util.regex包):

1.Java中在某個字串中查詢某個字元或者某個子字串

Java代碼

  1. String s = "@Shang Hai Hong Qiao Fei Ji Chang";     
  2. String regEx = "a|F"; //表示a或F
     
  3. Pattern pat = Pattern.compile(regEx);  
  4. Matcher mat = pat.matcher(s);  
  5. boolean rs = mat.find();  
String s = "@Shang Hai Hong Qiao Fei Ji Chang";   String regEx = "a|F"; //表示a或FPattern pat = Pattern.compile(regEx);Matcher mat = pat.matcher(s);boolean rs = mat.find(); 

    如果s中有regEx,那麼rs為true,否則為flase。

    如果想在尋找時忽略大小寫,則可以寫成Pattern pat=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);

2.在某個檔案中擷取一段字串

Java代碼

  1. String regEx = ".+\(.+)$";  
  2. String s = "c:\test.txt";  
  3. Pattern pat = Pattern.compile(regEx);  
  4. Matcher mat = pat.matcher(s);  
  5. boolean rs = mat.find();  
  6. for(int i=1;i<=mat.groupCount();i++){  
  7.   System.out.println(mat.group(i));  
  8. }  
String regEx = ".+\(.+)$";String s = "c:\test.txt";Pattern pat = Pattern.compile(regEx);Matcher mat = pat.matcher(s);boolean rs = mat.find();for(int i=1;i<=mat.groupCount();i++){  System.out.println(mat.group(i));} 

 以上的執行結果為test.txt,提取的字串儲存在mat.group(i)中,其中i最大值為mat.groupCount();

3.對字串的分割

Java代碼

  1. String regEx=":";  
  2. Pattern pat = Pattern.compile(regEx);  
  3. String[] rs = pat.split("aa:bb:cc");  
String regEx=":";Pattern pat = Pattern.compile(regEx);String[] rs = pat.split("aa:bb:cc"); 

 執行後,r就是{"aa","bb","cc"}

    如果用Regex分割就如上所示,一般我們都會使用下面更簡單的方法:

Java代碼

  1. String s = "aa:bb:cc";  
  2. String[] rs=s.split(":");  
String s = "aa:bb:cc";String[] rs=s.split(":"); 

 

4.字串的替換/刪除

Java代碼

  1. String regEx="@+";
    //表示一個或多個@  
  2. Pattern pat=Pattern.compile(regEx);  
  3. Matcher mat=pat.matcher("@@aa@b cc@@");  
  4. String s=mat.replaceAll("#");  
String regEx="@+"; //表示一個或多個@Pattern pat=Pattern.compile(regEx);Matcher mat=pat.matcher("@@aa@b cc@@");String s=mat.replaceAll("#"); 

 結果為"##aa#b cc##"
  
 如果要把字串中的@都給刪除,只用要Null 字元串替換就可以了:

Java代碼

  1. String s=mat.replaceAll(""); 
String s=mat.replaceAll("");

 結果為"aab cc"

註:對Pattern類的說明:
      1.public final class java.util.regex.Pattern是Regex編譯後的表達法。

      下面的語句將建立一個Pattern對象並賦值給控制代碼pat:Pattern pat = Pattern.compile(regEx);
      有趣的是,Pattern類是final類,而且它的構造器是private。也許有人告訴你一些設計模式的東西,或者你自己查有關資料。這裡的結論是:Pattern類不能被繼承,我們不能通過new建立Pattern類的對象。
       因此在Pattern類中,提供了2個重載的靜態方法,其傳回值是Pattern對象(的引用)。如:

Java代碼

  1. public static Pattern compile(String regex) {  
  2.         return new Pattern(regex,
    0);  
public static Pattern compile(String regex) {        return new Pattern(regex, 0);}

       當然,我們可以聲明Pattern類的控制代碼,如Pattern pat = null;

    2.pat.matcher(str)表示以用Pattern去產生一個字串str的匹配器,它的傳回值是一個Matcher類的引用。
       我們可以簡單的使用如下方法:boolean rs = Pattern.compile(regEx).matcher(str).find();


常用的Regex:

匹配特定數字:
^[1-9]d*$    //匹配正整數
^-[1-9]d*$   //匹配負整數
^-?[1-9]d*$   //匹配整數
^[1-9]d*|0$  //匹配非負整數(正整數 + 0)
^-[1-9]d*|0$   //匹配非正整數(負整數 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮點數
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配負浮點數
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮點數
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非負浮點數(正浮點數 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮點數(負浮點數 + 0)
評註:處理大量資料時有用,具體應用時注意修正

匹配特定字串:
^[A-Za-z]+$  //匹配由26個英文字母組成的字串
^[A-Z]+$  //匹配由26個英文字母的大寫組成的字串
^[a-z]+$  //匹配由26個英文字母的小寫組成的字串
^[A-Za-z0-9]+$  //匹配由數字和26個英文字母組成的字串
^w+$  //匹配由數字、26個英文字母或者底線組成的字串

在使用RegularExpressionValidator驗證控制項時的驗證功能及其驗證運算式介紹如下:

只能輸入數字:“^[0-9]*$”
只能輸入n位的數字:“^d{n}$”
只能輸入至少n位元字:“^d{n,}$”
只能輸入m-n位的數字:“^d{m,n}$”
只能輸入零和非零開頭的數字:“^(0|[1-9][0-9]*)$”
只能輸入有兩位小數的正實數:“^[0-9]+(.[0-9]{2})?$”
只能輸入有1-3位小數的正實數:“^[0-9]+(.[0-9]{1,3})?$”
只能輸入非零的正整數:“^+?[1-9][0-9]*$”
只能輸入非零的負整數:“^-[1-9][0-9]*$”
只能輸入長度為3的字元:“^.{3}$”
只能輸入由26個英文字母組成的字串:“^[A-Za-z]+$”
只能輸入由26個大寫英文字母組成的字串:“^[A-Z]+$”
只能輸入由26個小寫英文字母組成的字串:“^[a-z]+$”
只能輸入由數字和26個英文字母組成的字串:“^[A-Za-z0-9]+$”
只能輸入由數字、26個英文字母或者底線組成的字串:“^w+$”
驗證使用者密碼:“^[a-zA-Z]w{5,17}$”正確格式為:以字母開頭,長度在6-18之間,

只能包含字元、數字和底線。
驗證是否含有^%&’,;=?$”等字元:“[^%&’,;=?$x22]+”
只能輸入漢字:“^[u4e00-u9fa5],{0,}$”
驗證Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
驗證InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
驗證電話號碼:“^((d{3,4})|d{3,4}-)?d{7,8}$”

正確格式為:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,

“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
驗證社會安全號碼(15位或18位元字):“^d{15}|d{}18$”
驗證一年的12個月:“^(0?[1-9]|1[0-2])$”正確格式為:“01”-“09”和“1”“12”
驗證一個月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”

正確格式為:“01”“09”和“1”“31”。

匹配中文字元的Regex: [u4e00-u9fa5]
匹配雙位元組字元(包括漢字在內):[^x00-xff]
匹配空行的Regex:n[s| ]*r
匹配HTML標記的Regex:/< (.*)>.*|< (.*) />/
匹配首尾空格的Regex:(^s*)|(s*$)
匹配Email地址的Regex:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配網址URL的Regex:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.