心情是伤感的,因为离别

1. 匹配规则表

正则表达式的匹配规则是从左到右按规则匹配

字符串匹配:使用String.matches()方法

image-20191028180715116

image-20191028180722790

image-20191028180749286

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 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);//23:55

String hour = matcher.group(1);
System.out.println(hour);//23

String min = matcher.group(2);
System.out.println(min);//55
}

image-20191029164506310

2.4非贪婪匹配

1.给定一个数字字符串,判断末尾0的个数

image-20191029165040284

正则表达式默认使用贪婪匹配,尽可能多的向后匹配

String regex = "^(\\d+)(0*)$";
Pattern pattern = Pattern.compile(regex);

//获取matcher对象
Matcher matcher = pattern.matcher("123000");

if(matcher.matches()) {
String fisrt = matcher.group(1);
System.out.println(fisrt);//123000

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对象
Matcher matcher2 = pattern2.matcher("9999");

if(matcher2.matches()) {
String fisrt = matcher2.group(1);
System.out.println(fisrt);//匹配0个或者1个,非贪婪匹配,所以没有匹配到数字9

String second = matcher2.group(2);
System.out.println(second);//9999
}
}

3.搜索和替换

image-20191029192301560

3.1搜索

字符串切割:String.split()

String tags = "java php python";
String[]arr = tags.split("\\s");
System.out.println(Arrays.toString(arr));
//输出为 [java, php, python]

如果输入不规范

String tags = "java   php   python";
String[]arr = tags.split("\\s+");
System.out.println(Arrays.toString(arr));
//输出为 [java, php, python]

如果单词中由,:分割

String tags = "java, php:  python";
String[]arr = tags.split("[\\s\\,\\:]+");
System.out.println(Arrays.toString(arr));
//输出为 [java, php, python]

字符串搜索: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);//each
}

如果将表达式换成\\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 = "我我我......我我......爱...爱爱...学...学......学编程";
//1、首先去掉...(将.替换为""即可)
String regex = "\\.";
String str1 = str.replaceAll(regex,"");
System.out.println("1:"+str1);
//2、替代叠词
regex = "(.)\\1+";
String str2 = str1.replaceAll(regex, "$1");
System.out.println("2:"+str2);