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 正則表達式的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!