Java之 正则替换/分割/匹配
一、正则替换
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