程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 正則表達式具體引見

Java 正則表達式具體引見

編輯:關於JAVA

Java 正則表達式具體引見。本站提示廣大學習愛好者:(Java 正則表達式具體引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 正則表達式具體引見正文


 盡人皆知,在法式開辟中,不免會碰到須要婚配、查找、調換、斷定字符串的情形產生,而這些情形有時又比擬龐雜,假如用純編碼方法處理,常常會糟蹋法式員的時光及精神。是以,進修及應用正則表達式,便成懂得決這一抵觸的重要手腕。

 年夜 家都曉得,正則表達式是一種可以用於形式婚配和調換的標准,一個正則表達式就是由通俗的字符(例如字符a到z)和特別字符(元字符)構成的文字形式,它 用以描寫在查找文字主體時待婚配的一個或多個字符串。正則表達式作為一個模板,將某個字符形式與所搜刮的字符串停止婚配。

  自從jdk1.4推出java.util.regex包,就為我們供給了很好的JAVA正則表達式運用平台。

 由於正則表達式是一個很復雜的系統,所以我僅例舉些入門的概念,更多的請參閱相干書本及自行探索。

// 反斜槓
/t 距離 ('/u0009')
/n 換行 ('/u000A')
/r 回車 ('/u000D')
/d 數字 等價於[0-9]
/D 非數字 等價於[^0-9]
/s 空白符號 [/t/n/x0B/f/r]
/S 非空白符號 [^/t/n/x0B/f/r]
/w 零丁字符 [a-zA-Z_0-9]
/W 非零丁字符 [^a-zA-Z_0-9]
/f 換頁符
/e Escape
/b 一個單詞的界限
/B 一個非單詞的界限
/G 前一個婚配的停止

^為限制開首
^java     前提限制為以Java為開首字符
$為限制開頭
java$     前提限制為以java為開頭字符
.  前提限制除/n之外隨意率性一個零丁字符
java..     前提限制為java後除換行外隨意率性兩個字符

參加特定限制前提「[]」

[a-z]     前提限制在小寫a to z規模中一個字符
[A-Z]     前提限制在年夜寫A to Z規模中一個字符
[a-zA-Z] 前提限制在小寫a to z或年夜寫A to Z規模中一個字符
[0-9]     前提限制在小寫0 to 9規模中一個字符
[0-9a-z] 前提限制在小寫0 to 9或a to z規模中一個字符
[0-9[a-z]] 前提限制在小寫0 to 9或a to z規模中一個字符(交集)

[]中參加^後加再次限制前提「[^]」

[^a-z]     前提限制在非小寫a to z規模中一個字符
[^A-Z]     前提限制在非年夜寫A to Z規模中一個字符
[^a-zA-Z] 前提限制在非小寫a to z或年夜寫A to Z規模中一個字符
[^0-9]     前提限制在非小寫0 to 9規模中一個字符
[^0-9a-z] 前提限制在非小寫0 to 9或a to z規模中一個字符
[^0-9[a-z]] 前提限制在非小寫0 to 9或a to z規模中一個字符(交集)

在限制前提為特定字符湧現0次以上時,可使用「*」

J*     0個以上J
.*     0個以上隨意率性字符
J.*D     J與D之間0個以上隨意率性字符

在限制前提為特定字符湧現1次以上時,可使用「+」

J+     1個以上J
.+     1個以上隨意率性字符
J.+D     J與D之間1個以上隨意率性字符

在限制前提為特定字符湧現有0或1次以上時,可使用「?」

JA?     J或許JA湧現

限制為持續湧現指定次數字符「{a}」

J{2}     JJ
J{3}     JJJ
文字a個以上,而且「{a,}」
J{3,}     JJJ,JJJJ,JJJJJ,???(3次以上J並存)
文字個以上,b個以下「{a,b}」
J{3,5}     JJJ或JJJJ或JJJJJ
二者取一「|」
J|A     J或A
Java|Hello     Java或Hello
 
「()」中劃定一個組合類型
好比,我查詢<a href=/"index.html/">index</a>中<a href></a>間的數據,可寫作<a.*href=/".*/">(.+?)</a>

在應用Pattern.compile函數時,可以參加掌握正則表達式的婚配行動的參數:

Pattern Pattern.compile(String regex, int flag)

flag的取值規模以下:

Pattern.CANON_EQ     當且僅當兩個字符的"正軌分化(canonical decomposition)"都完整雷同的情形下,才認定婚配。好比用了這個標記以後,表達式"a/u030A"會婚配"?"。默許情形下,不斟酌"規 范相等性(canonical equivalence)"。

Pattern.CASE_INSENSITIVE(?i)     默許情形下,年夜小寫不明感的婚配只實用於US-ASCII字符集。這個標記能讓表達式疏忽年夜小寫停止婚配。要想對Unicode字符停止年夜小不明感的匹 配,只需將UNICODE_CASE與這個標記合起來就好了。

Pattern.COMMENTS(?x)     在這類形式下,婚配時會疏忽(正則表達式裡的)空格字符(譯者注:不是指表達式裡的"//s",而是指表達式裡的空格,tab,回車之類)。正文從#開端,一向到這行停止。可以經由過程嵌入式的標記來啟用Unix行形式。

Pattern.DOTALL(?s)     在這類形式下,表達式'.'可以婚配隨意率性字符,包含表現一行的停止符。默許情形下,表達式'.'不婚配行的停止符。

Pattern.MULTILINE
(?m)     在這類形式下,'^'和'$'分離婚配一行的開端和停止。另外,'^'依然婚配字符串的開端,'$'也婚配字符串的停止。默許情形下,這兩個表達式僅僅婚配字符串的開端和停止。

Pattern.UNICODE_CASE
(?u)     在這個形式下,假如你還啟用了CASE_INSENSITIVE標記,那末它會對Unicode字符停止年夜小寫不明感的婚配。默許情形下,年夜小寫不敏感的婚配只實用於US-ASCII字符集。
Pattern.UNIX_LINES(?d)     在這個形式下,只要'/n'才被認作一行的中斷,而且與'.','^',和'$'停止婚配。

拋開空洞的概念,上面寫出幾個簡略的Java正則用例:

◆好比,在字符串包括驗證時

//查找以Java開首,隨意率性開頭的字符串
 Pattern pattern = Pattern.compile("^Java.*");
 Matcher matcher = pattern.matcher("Java不是人");
 boolean b= matcher.matches();
 //當前提知足時,將前往true,不然前往false
 System.out.println(b);

◆以多前提朋分字符串時

Pattern pattern = Pattern.compile("[, |]+");
String[] strs = pattern.split("Java Hello World Java,Hello,,World|Sun");
for (int i=0;i<strs.length;i++) {
  System.out.println(strs[i]);
} 

◆文字調換(初次湧現字符)

Pattern pattern = Pattern.compile("正則表達式");
Matcher matcher = pattern.matcher("正則表達式 Hello World,正則表達式 Hello World");
//調換第一個相符正則的數據
System.out.println(matcher.replaceFirst("Java"));

◆文字調換(全體)

Pattern pattern = Pattern.compile("正則表達式");
Matcher matcher = pattern.matcher("正則表達式 Hello World,正則表達式 Hello World");
//調換第一個相符正則的數據
System.out.println(matcher.replaceAll("Java"));

◆文字調換(置換字符)

Pattern pattern = Pattern.compile("正則表達式");
Matcher matcher = pattern.matcher("正則表達式 Hello World,正則表達式 Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
  matcher.appendWordStrment(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());

◆驗證能否為郵箱地址

String str="[email protected]";
Pattern pattern = Pattern.compile("[//w//.//-]+@([//w//-]+//.)+[//w//-]+",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());

◆去除html標志

Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
Matcher matcher = pattern.matcher("<a href=/"index.html/">主頁</a>");
String string = matcher.replaceAll("");
System.out.println(string);

◆查找html中對應前提字符串

Pattern pattern = Pattern.compile("href=/"(.+?)/"");
Matcher matcher = pattern.matcher("<a href=/"index.html/">主頁</a>");
if(matcher.find())
 System.out.println(matcher.group(1));
}

◆截取http://地址

//截取url
Pattern pattern = Pattern.compile("(http://|https://){1}[//w//.//-/:]+");
Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){       
  buffer.append(matcher.group());    
  buffer.append("/r/n");       
System.out.println(buffer.toString());
}

        ◆調換指定{}中文字

String str = "Java今朝的成長史是由{0}年-{1}年";
String[][] object={new String[]{"//{0//}","1995"},new String[]{"//{1//}","2007"}};
System.out.println(replace(str,object));

public static String replace(final String sourceString,Object[] object) {
      String temp=sourceString;  
      for(int i=0;i<object.length;i++){
           String[] result=(String[])object[i];
        Pattern  pattern = Pattern.compile(result[0]);
        Matcher matcher = pattern.matcher(temp);
        temp=matcher.replaceAll(result[1]);
      }
      return temp;
}

◆以正則前提查詢指定目次下文件

 //用於緩存文件列表
    private ArrayList files = new ArrayList();
    //用於承載文件途徑
    private String _path;
    //用於承載未歸並的正則公式
    private String _regexp;
    
    class MyFileFilter implements FileFilter {

       /**
        * 婚配文件稱號
        */
       public boolean accept(File file) {
        try {
         Pattern pattern = Pattern.compile(_regexp);
         Matcher match = pattern.matcher(file.getName());        
         return match.matches();
        } catch (Exception e) {
         return true;
        }
       }
      }
    
    /**
     * 解析輸出流
     * @param inputs
     */
    FilesAnalyze (String path,String regexp){
      getFileName(path,regexp);
    }
    
    /**
     * 剖析文件名並參加files
     * @param input
     */
    private void getFileName(String path,String regexp) {
      //目次
       _path=path;
       _regexp=regexp;
       File directory = new File(_path);
       File[] filesFile = directory.listFiles(new MyFileFilter());
       if (filesFile == null) return;
       for (int j = 0; j < filesFile.length; j++) {
        files.add(filesFile[j]);
       }
       return;
      }
  
    /**
     * 顯示輸入信息
     * @param out
     */
    public void print (PrintStream out) {
      Iterator elements = files.iterator();
      while (elements.hasNext()) {
        File file=(File) elements.next();
          out.println(file.getPath());  
      }
    }

    public static void output(String path,String regexp) {

      FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp);
      fileGroup1.print(System.out);
    }
  
    public static void main (String[] args) {
      output("C://","[A-z|.]*");
    }

Java正則的功用還有許多,現實上只需是字符處置,就沒有正則做不到的工作存在。(固然,正則說明時較耗時光就是了|||……)

以上就是對Java 正則表達式的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved