我是靠谱客的博主 无心摩托,这篇文章主要介绍JavaSE实战教程4:正则表达式前言一、简介二、作用三、常用的元字符四、匹配规则五、分组匹配六、非贪婪匹配七、练习题,现在分享给大家,希望可以做个参考。

文章目录

  • 前言
  • 一、简介
  • 二、作用
  • 三、常用的元字符
  • 四、匹配规则
  • 五、分组匹配
  • 六、非贪婪匹配
  • 七、练习题


前言

本篇讲述正则表达式


一、简介

正则表达式可以用字符串来描述规则,并用来匹配字符串。

案例1:
判断手机号,我们用正则表达式d{11}:

复制代码
1
2
3
4
boolean 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
10
public 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
7
d 任意一个数字 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
15
X? 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
13
public 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
17
public 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
14
public 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
3
find()方法:部分匹配即可,在部分匹配时和完全匹配时返回true,匹配不上返回false; matches()方法:需要完全匹配,只有在完全匹配时返回true,匹配不上和部分匹配都返回false。

六、非贪婪匹配

? 非贪婪匹配

复制代码
1
2
3
因为正则表达式默认使用贪婪匹配:任何一个规则,它总是尽可能多地向后匹配,因此,d+总是会把后面的0包含进来。 要让d+尽量少匹配,让0*尽量多匹配,我们就必须让d+使用非贪婪匹配。在规则d+后面加个?即可表示非贪婪匹配。

我们改写正则表达式如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
public 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
9
public 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
11
public 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:正则表达式前言一、简介二、作用三、常用内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部