正则表达式 | 浅解

正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。是一个用于匹配字符串的模板。
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。

部分参考自:https://www.runoob.com/regexp/regexp-syntax.html 正则表达式:在线工具

1 创建正则表达式

1.1 简单例子:

emoji 正则表达式识别 正则表达式在线解析_子串

^ 为匹配输入字符串的开始位置。
[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。
abcemoji 正则表达式识别 正则表达式在线解析_字符串_02

emoji 正则表达式识别 正则表达式在线解析_正则表达式_03

1.2 非打印字符的转义序列:

emoji 正则表达式识别 正则表达式在线解析_emoji 正则表达式识别_04

1.3 特殊字符(一般使用反斜线 \ 转义字符):

emoji 正则表达式识别 正则表达式在线解析_emoji 正则表达式识别_05

1.4 限定符:

emoji 正则表达式识别 正则表达式在线解析_字符串_06

1.5 定位符:

emoji 正则表达式识别 正则表达式在线解析_emoji 正则表达式识别_07

1.6 预定义字符:

emoji 正则表达式识别 正则表达式在线解析_正则表达式_08

1.7 方括号表达式:

emoji 正则表达式识别 正则表达式在线解析_正则表达式_09

1.8 边界匹配符:

emoji 正则表达式识别 正则表达式在线解析_字符串_10

1.9 三种模式

  • Greedy(贪婪模式):数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。
  • Reluctant(勉强模式):用问号后缀()表示,它只会匹配最少的字符。也称为最小匹配模式。
  • Possessive(占有模式):用加号后缀(+)表示,目前只有Java支持占有模式,通常比较少用。
String str = "hello , java!";
//贪婪模式的正则表达式
str.replaceFirst("\\w*"," ");
//勉强模式的正则表达式
str.replaceFirst("\\w*?"," ");

2 使用正则表达式

2.1 使用Pattern(样式)和Matcher(匹配)来使用正则表达式。

  • Pattern对象是正则表达式编译后内存中的表示形式。正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。
//字符串编译为Pattern对象
Pattern p = Pattern.compile("a*b");
//利用Pattern对象创建对应的Matcher对象
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();//返回true
  • 上面定义的Pattern对象可以多次重复使用。Pattern是不可变类,可供多个并发线程安全使用。

2.2 Matcher类提供几个常用方法:

find():返回目标字符串中是否包含与Pattern匹配的子串。
group():返回上一次与Pattern匹配的子串
start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置
end():返回上一次与Patterm匹配的子串在目标字符串中的结束位置加1
lookingAt():返回目标字符串前面部分与Pattern是否匹配
matches():返回整个目标字符串与Pattern是否匹配
reset():将现有的Matcher对象应用于一个新的字符序列

  • 在Pattern、Matcher类的介绍中经常会看到一个CharSequence接口。简单地说,CharSequence代表一个各种表示形式的字符串。

2.3 找电话号码(程序示例):

public class FindGroup{
	public static void main(String[] args){
		//使用字符串模拟从网络上得到的网页源码
		String str = "我想求购一本《疯狂Java讲义》,尽快联系我13500006666"
		+"交朋友,电话号码是13611125565"
		+"出售二手电脑,联系方式15899903312";
		//创建一个Pattern对象,并用它建立一个Matcher对象
		//该正则表达式只抓取13x和15X段的手机号
		//实际要抓取哪些电话号码,只要修改正则表达式即可
		Matcher m = Pattern.compile("( (13\\d) | (15\\d) ) \\ d(8)").matcher(str);
		//将所有符合正则表达式的子串(电话号码)全部输出
		while(m.find()){	
			System.out.println(m.group());
		}
	}
}
  • 一旦找到对应子串,下次调用find()方法接着向下查找;带int参数find()方法将从该int索引处向下搜索。
  • start()end() 方法用于确定子串在目标中的位置。
  • matcher()lookingAt() 方法有点像:matcher() 要求整个字符串和Pattern完全匹配才返回true;lookingAt() 只要以Pattern开头就会返回true;
  • reset() 方法可将现有的Matcher对象应用于新的字符序列。
  • Matcher类提供的replaceAll() 方法把字符串中所有与正则表达式匹配的子串替换成“xxx”;Matcher类还提供一个replaceFirst() 方法,只替换第一个匹配子串。
  • String类中也提供了replaceAll()、replaceFirst() 、split()等方法。

2.4 在线工具

  • 不会写可以使用,正则表达式:在线工具 提供帮助,并且其还提供许多常用的正则表达式,可以到网站直接粘贴使用。