心情是伤感的,因为离别
1. 匹配规则表
正则表达式的匹配规则是从左到右按规则匹配
字符串匹配:使用String.matches()方法
2.匹配用例
2.1简单匹配
1.判断输入年份是否是20xx年
正则表达式:20\d\d
java字符串:20\d\d
测试代码
public class is2000 {
public static boolean is20xx(String s) { if(s==null) return false; return s.matches("20\\d\\d"); }
}
package test; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import com.x2yu.is2000;
class EmaiTest {
@Test void testis20xx() { assertTrue(is2000.is20xx("2000")); assertTrue(is2000.is20xx("2019")); assertTrue(is2000.is20xx("2099")); assertFalse(is2000.is20xx("1997")); assertFalse(is2000.is20xx("199A")); assertFalse(is2000.is20xx("20aa")); assertFalse(is2000.is20xx(null)); } }
|
2.2复杂匹配
^和$匹配开头和结尾
例如 ^A\d{3}$ 就是匹配 A字母开头后跟3个数字的字符串
1.对输入的qq号进行匹配(qq匹配规则:长度为至少5位,纯数字组成,且不能以0开头。)
java字符串:[1-9]\d{4,}
public class isQQ { public static boolean isqq(String s) { if(s==null) return false; return s.matches("^[1-9]\\d{4,}$"); } }
@Test void testIsQQ() { assertTrue(isQQ.isqq("123452")); assertTrue(isQQ.isqq("3663792787")); assertFalse(isQQ.isqq("366379278A")); assertFalse(isQQ.isqq("3623")); assertFalse(isQQ.isqq("02343623")); assertFalse(isQQ.isqq("AA2343623")); assertFalse(is2000.is20xx(null)); }
|
2.匹配电话号码 电话号码由 区号-号码本体 组成
区号:0开头的后跟2-3位数字
连接符号:-
号码本体:1-9开头后跟5-7位数字
正则表达式:0\d{2,3} \- [1-9]\d{5,7}
java字符串:0\\d{2,3}\\-[1-9]\\d{5,7}
2.3分组匹配
(…)可以用于分组匹配
1.把日期:2019-10-28 –> “2019” “10” “28”
正则表达式:(\d{4})-(\d{1,2})-(\d{1,2})
2.提取24小时制度时间
正则表达式:^([0,1] [0,9]|2[0,3]):([0-5] [0-9])$
可以把正则表达式编译为Pattern对象,方便重复使用
String regex = "^([0,1][0,9]|2[0,3])\\:([0-5][0-9])$"; Pattern pattern = Pattern.compile(regex); System.out.println(pattern.matcher("23:55").matches());\\true
Matcher matcher = pattern.matcher("23:55"); System.out.println(matcher.matches());\\true
|
使用 Matcher.group(index) 可以提取子串
Matcher matcher = pattern.matcher("23:55");
if(matcher.matches()) { String whole = matcher.group(0); System.out.println(whole); String hour = matcher.group(1); System.out.println(hour); String min = matcher.group(2); System.out.println(min); }
|
2.4非贪婪匹配
1.给定一个数字字符串,判断末尾0的个数
正则表达式默认使用贪婪匹配,尽可能多的向后匹配
String regex = "^(\\d+)(0*)$"; Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("123000");
if(matcher.matches()) { String fisrt = matcher.group(1); System.out.println(fisrt); String second = matcher.group(2); System.out.println(second); }
|
使用?实现非贪婪匹配
正则表达式变为^(\\d+?)(0*)$
?既可以用来表示匹配0个或者1个,也可以表示非贪婪匹配
第一个?号表示匹配0个或者1个数字,第二个?表示非贪婪匹配(尽可能少的匹配)
String regex2 = "^(\\d??)(9*)$"; Pattern pattern2 = Pattern.compile(regex2);
Matcher matcher2 = pattern2.matcher("9999");
if(matcher2.matches()) { String fisrt = matcher2.group(1); System.out.println(fisrt); String second = matcher2.group(2); System.out.println(second); } }
|
3.搜索和替换
3.1搜索
字符串切割:String.split()
String tags = "java php python"; String[]arr = tags.split("\\s"); System.out.println(Arrays.toString(arr));
|
如果输入不规范
String tags = "java php python"; String[]arr = tags.split("\\s+"); System.out.println(Arrays.toString(arr));
|
如果单词中由,:分割
String tags = "java, php: python"; String[]arr = tags.split("[\\s\\,\\:]+"); System.out.println(Arrays.toString(arr));
|
字符串搜索:Matcher.find()
从一个字符串中搜索指定单词
String s = "I don't know if we each have a destiny, or if we're " + "all just floating around accidental—like on a breeze.";
Pattern pattern = Pattern.compile("each",Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(s);
while(matcher.find()) { String sub = s.substring(matcher.start(),matcher.end()); System.out.println(sub); }
|
如果将表达式换成\\w+
表示匹配每个单词
如果要匹配包含某个字母的单词 比如e
表达式为\\w*e\\w*
3.2替换
字符串替换:String.replaceAll()
空格替换
将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
String s = "We Are Happy"; String r = s.replaceAll("\\s","%20")
|
4.练习
练习一:口吃怎么办?需求:请将下面的字符串“我我我……我我……爱…爱爱……学…学……学编程”改为:“我爱学编程”。
分析:首先我们可以将字符串中的“……”去掉,然后就可以将叠词替换为单个汉字即可。
String str = "我我我......我我......爱...爱爱...学...学......学编程"; String regex = "\\."; String str1 = str.replaceAll(regex,""); System.out.println("1:"+str1); regex = "(.)\\1+"; String str2 = str1.replaceAll(regex, "$1"); System.out.println("2:"+str2);
|