一、正則替換
replace(觀察參數可知:不是正則替換) replace(CharSequence target, CharSequence replacement)
replaceAll(是正則替換) replaceAll(String regex, String replacement)
String txt = "you and I live in kb0845 together, you are really idiot"; System.out.println(txt.replaceAll("you|I","#")); System.out.println(txt.replaceAll("\\d+","NUMBER"));
二、分割
1)\1,\2和\\1,\\2的區別:
Pattern p = Pattern.compile("(\\d)(a)(b4)\\2"); Matcher matcher = p.matcher("8ab4a"); //匹配
/** \\2代表的是與第二組括號內的內容相同也就是必須以第二組括號里的字母a結尾。其它數字以此類推。 括號的序號以第幾個左括號為准。如"(b(\\d)(a))\\1"匹配的是'b3ab3a' 而\2則代表字符'\2'。如"(a)(\\d)\2"匹配的是'a8\2'。 */
舉例:
/** * 4. 將下面的國家分割打印 ChinaqqqAmericahhhhhEnglandaaaaaaMexica */ public static void testContry() { String country="ChinaqqqqqAmericahhhEnglandaaaaaaMexica"; String[] countrys=country.split("(.)\\1+"); // 前者和后者匹配一樣的單個字符,並且可以有多個 for(String str:countrys) { System.out.println(str); } }
2) 符號匹配[直接加符號]
/** * 3. 將下面小學生的成績分割打印出來 數學=100,語文=69;英語=70,計算機=90:地理=85,體育=50 */ public static void testScore() { String score="數學=100,語文=69;英語=70;計算機=90:地理=85,體育=50"; String[] scores=score.split("[,;:]"); for(String str:scores) { System.out.println(str); } }
3)空格加tab制表符的匹配
/** * String str=”薪水 職位 姓名 年齡 性別”; */ public static void testSpace() { /*String info="薪水 職位 姓名 年齡 性別"; String[] infoArray=info.split(" +");*/ String info="薪水 職位 姓名 年齡 性別 XXX"; String[] infoArray=info.split("[ \t]+"); for(String str:infoArray) { System.out.println(str); } }
4).的匹配需要\\.
/** * 1. 以點號 . 切割IP 地址判斷是否為C類IP地址 C類IP地址:192.168.0.0~192.168.255.255 */ public static void testCIP(String ip) { String[] ips=ip.split("\\."); for(String str:ips) { System.out.println(str); } }
三、匹配
① 匹配方法
1)懶惰匹配
例:一個字符串“abcdakdjd”
regex="a.*?d"; 懶惰匹配,每次匹配最短字符串,和find()是好朋友常用來連用
經過測試:
(.*?)一定要用於a和b之間!可以group出來
.*? 用於最后可以,但是(.*?)用於句末的匹配匹配不出來,此時需要替換成(.*)
2)貪婪匹配
regex2="a.*d"; 貪婪匹配,一次匹配最長的字符串
② Java方法
1)matches() 全部匹配
String txt1 = "henry@hotmail.ooo"; String regex = "\\w{3,128}@[a-z0-9]{2,10}\\.(com|cn|org)"; Pattern compile = Pattern.compile(regex); Matcher matcher = compile.matcher(txt1); System.out.println(matcher.matches());
2)find() 部分匹配,與()配合group()使用
# group(0)就是指的整個串,group(1) 指的是第一個括號里的東西,group(2)指的第二個括號里的東西
# find() 嘗試查找與該模式匹配的輸入序列的下一個子序列
while(mat.find( )){....} => regEx可以匹配多次
if(mat.find( )){....} => regEx只需要匹配一次
String regEx = "count(\\d+)(df)"; String s = "count000dfdfsdffaaaa1"; 1. Pattern pat = Pattern.compile(regEx); 2. Matcher mat = pat.matcher(s); if(mat.find()){ System.out.println(mat.group(2)); // 輸出df }
// group() count0000df
// group(1) 0000