文章目录
- 前言
- 一、简介
- 二、作用
- 三、常用的元字符
- 四、匹配规则
- 五、分组匹配
- 六、非贪婪匹配
- 七、练习题
前言
本篇讲述正则表达式
一、简介
正则表达式可以用字符串来描述规则,并用来匹配字符串。
案例1:
判断手机号,我们用正则表达式d{11}:
1
2
3
4boolean isValidMobileNumber(String s) { return s.matches("\d{11}"); }
案例2:
要判断用户输入的年份是否是20##年,我们先写出规则如下:
一共有4个字符,分别是:2,0,09任意数字,09任意数字。
对应的正则表达式就是:20dd,其中d表示任意一个数字。
把正则表达式转换为Java字符串就变成了20dd,注意Java字符串用表示。
最后,用正则表达式匹配一个字符串的代码如下:
1
2
3
4
5
6
7
8
9
10public class Test { public static void main(String[] args) { String regex = "20\d\d"; System.out.println("2019".matches(regex)); // true System.out.println("2100".matches(regex)); // false } }
二、作用
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤匹配逻辑。通过正则表达式可以对字符串数据进行一些复杂的匹配、查找、替换操作。常见的就是将其用在数据格式的验证中。
正则表达式的匹配规则是从左到右按规则匹配。我们首先来看如何使用正则表达式来做精确匹配。
三、常用的元字符
1、特殊字符
1
2
3. 任意一个字符,除换行符:r或n 转义字符,当需要描述一个已经被正则表达式使用的特殊字符时,我们就可以通过使用将其转变为原来的意思
2、预定义字符集
1
2
3
4
5
6
7d 任意一个数字 w 任意一个单词字符(只能是数字、字母、下划线) s 任意一个空白字符(t r n f x0B 空格符号) D 任意一个非数字字符 W 任意一个非单词字符 S 任意一个非空白字符
3、字符集合
1
2
3
4
5
6
7
8
9
10
11
12
13
14[] 用来描述单一字符,方括号内部可以定义这个字符的内容,也可以描述一个范围 [abc] 该字符只能是a或b或c [123] 该字符只能是1或2或3 [a-z] a到z任意一个字符(所有小写字母) [0-9] 任意一个数字 [a-zA-Z0-9_] 字母数字下划线 [^A-F] 指定范围外的任意字符(非A~F)
4、数量词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15X? 0个或1个X X* 0个或任意多个X X+ 1个或任意多个X(大于等于1个X) X{n} n个X X{n,} n到任意多个X(大于等于n个X) X{n,m} n个到m个X [u4e00-u9fa5]{1,} 1到多个中文字符
四、匹配规则
s 匹配空格字符
1
2
3用s可以匹配一个空格字符,注意空格字符不但包括空格,还包括tab字符(在Java中用t表示)。 例如,"a\sc"可以匹配"a c"
^ 匹配开头
$ 匹配结尾
1
2用正则表达式进行多行匹配时,我们用^表示开头,$表示结尾。例如,"^A\d{3}$",可以匹配"A001"、"A380"。
| 使用或
1
2用|连接的两个正则规则是或规则,例如,"AB|CD"表示可以匹配"AB"或"CD"。
() 使用括号
1
2
3
4现在我们想要匹配字符串learn java、learn php和learn go怎么办? 一个最简单的规则是"learn\sjava|learn\sphp|learn\sgo",但是这个规则太复杂了, 可以把公共部分提出来,然后用(...)把子规则括起来表示成"learn\s(java|php|go)"。
五、分组匹配
1、简介
(1)Pattern:模式类
(2)Matcher:匹配类
使用Matcher时,必须首先调用matches()判断是否匹配成功,匹配成功后,才能调用group()提取子串。
案例:
1
2
3
4
5
6
7
8
9
10
11
12
13public class Test { public static void main(String[] args) throws ParseException { //编译出一个模式类 Pattern pattern = Pattern.compile("1\d{10}"); //用模式类去匹配字符串,得到一个Matcher匹配实例 Matcher matcher = pattern.matcher("13353745137"); //获取是否匹配的boolean值 boolean matches = matcher.matches(); System.out.println(matches); //true } }
2、提取分组
(1)matches()方法
正则表达式用(…)分组可以通过Matcher对象快速提取子串:
- group(0)表示匹配的整个字符串;
- group(1)表示第1个子串,group(2)表示第2个子串,以此类推。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class Test { public static void main(String[] args) throws ParseException { Pattern pattern = Pattern.compile("(\d{3,4})\-(\d{7,8})"); Matcher matcher = pattern.matcher("010-12345678"); if (matcher.matches()) { String g1 = matcher.group(1); String g2 = matcher.group(2); System.out.println(g1); // 010 System.out.println(g2); // 12345678 } else { System.out.println("匹配失败!"); } } }
(2)find()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class Test { public static void main(String[] args) throws ParseException { String str = "123 哈哈哈 456 嘻嘻嘻 789 啊啊啊"; Matcher matcher = Pattern.compile("\d+").matcher(str); while (matcher.find()) { System.out.println(matcher.group()); } } } 输出结果: 123 456 789
(3)find()和matches()的区别
1
2
3find()方法:部分匹配即可,在部分匹配时和完全匹配时返回true,匹配不上返回false; matches()方法:需要完全匹配,只有在完全匹配时返回true,匹配不上和部分匹配都返回false。
六、非贪婪匹配
? 非贪婪匹配
1
2
3因为正则表达式默认使用贪婪匹配:任何一个规则,它总是尽可能多地向后匹配,因此,d+总是会把后面的0包含进来。 要让d+尽量少匹配,让0*尽量多匹配,我们就必须让d+使用非贪婪匹配。在规则d+后面加个?即可表示非贪婪匹配。
我们改写正则表达式如下:
1
2
3
4
5
6
7
8
9
10
11public class Test { public static void main(String[] args) throws ParseException { Pattern pattern = Pattern.compile("(\d+?)(0*)"); Matcher matcher = pattern.matcher("1230000"); if (matcher.matches()) { System.out.println("group1=" + matcher.group(1)); // group1=123 System.out.println("group2=" + matcher.group(2)); // group2=0000 } } }
七、练习题
1、年龄数字部分取出,然后包装
1
2
3
4
5
6
7
8
9public class Test { public static void main(String[] args) throws ParseException { String str = "my name is xxx ,my age is 18" ; String s = str.replaceAll("(\d+)", "<b>$1</b>"); System.out.println(s); // my name is xxx ,my age is <b>18</b> } }
2、(.)1+ 不重复打印叠词
1
2
3
4
5
6
7
8
9
10
11public class Test { public static void main(String[] args) throws ParseException { String a = "aaaa bbbbb 中中中中 cccc" ; String regex = "(.)\1+"; String s = a.replaceAll(regex, "$1"); System.out.println(s); // a b 中 c } }
最后
以上就是无心摩托最近收集整理的关于JavaSE实战教程4:正则表达式前言一、简介二、作用三、常用的元字符四、匹配规则五、分组匹配六、非贪婪匹配七、练习题的全部内容,更多相关JavaSE实战教程4:正则表达式前言一、简介二、作用三、常用内容请搜索靠谱客的其他文章。
发表评论 取消回复