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

概述

文章目录

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


前言

本篇讲述正则表达式


一、简介

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

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

boolean isValidMobileNumber(String s) {
return s.matches("\d{11}");
}

案例2:
要判断用户输入的年份是否是20##年,我们先写出规则如下:
一共有4个字符,分别是:2,0,09任意数字,09任意数字。
对应的正则表达式就是:20dd,其中d表示任意一个数字。
把正则表达式转换为Java字符串就变成了20dd,注意Java字符串用表示。
最后,用正则表达式匹配一个字符串的代码如下:

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、特殊字符

.	任意一个字符,除换行符:r或n
	转义字符,当需要描述一个已经被正则表达式使用的特殊字符时,我们就可以通过使用将其转变为原来的意思

2、预定义字符集

d	任意一个数字
w	任意一个单词字符(只能是数字、字母、下划线)
s	任意一个空白字符(t r n f x0B 空格符号)
D	任意一个非数字字符
W	任意一个非单词字符
S	任意一个非空白字符

3、字符集合

[]
用来描述单一字符,方括号内部可以定义这个字符的内容,也可以描述一个范围
[abc]
该字符只能是a或b或c
[123]
该字符只能是1或2或3
[a-z]
a到z任意一个字符(所有小写字母)
[0-9]
任意一个数字
[a-zA-Z0-9_]	字母数字下划线
[^A-F]
指定范围外的任意字符(非A~F)

4、数量词

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 匹配空格字符

s可以匹配一个空格字符,注意空格字符不但包括空格,还包括tab字符(在Java中用t表示)。
例如,"a\sc"可以匹配"a c"

^ 匹配开头
$ 匹配结尾

用正则表达式进行多行匹配时,我们用^表示开头,$表示结尾。例如,"^A\d{3}$",可以匹配"A001""A380"

| 使用或

|连接的两个正则规则是或规则,例如,"AB|CD"表示可以匹配"AB""CD"

() 使用括号

现在我们想要匹配字符串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()提取子串。

案例:

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个子串,以此类推。
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()方法

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()的区别

find()方法:部分匹配即可,在部分匹配时和完全匹配时返回true,匹配不上返回false;
matches()方法:需要完全匹配,只有在完全匹配时返回true,匹配不上和部分匹配都返回false。

六、非贪婪匹配

? 非贪婪匹配

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

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

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、年龄数字部分取出,然后包装

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+ 不重复打印叠词

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:正则表达式前言一、简介二、作用三、常用的元字符四、匹配规则五、分组匹配六、非贪婪匹配七、练习题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部