目前所做的项目需要用到正则表达式,重新总结一下正则表达式。
正则表达式看似简单,实则门路颇多,究其原因也就是其太灵活了。完全掌握还是需要耗费一些功夫的。
一、正则表达式原字符
读者需对正则表达式元字符有一个初步的印象,实际应用时可以查阅文档。
正则表达式可以分为六类:限定符、选择匹配符、分组组合和反向引用符、字符匹配符、定位符、特殊字符
1、限定符、转义符
字符 | 描述 |
---|---|
\ | 转义字符 |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的子表达式零次或多次,等价于{0,} |
+ | 匹配前面的子表达式一次或多次,等价于{1,} |
? | 匹配前面的子表达式零次或一次,等价于{0,1} |
{n} | 匹配确定的n次 |
{n,} | 至少匹配n次 |
{n,m} | 最少匹配n次且最多匹配m次 |
{?} | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的 |
{n,} | 至少匹配n次 |
{\b} | 匹配一个单词边界 |
{\B} | 匹配非单词边界 |
2、字符匹配符
字符 | 说明 |
---|---|
[xyz] | 匹配所包含的任意一个字符 |
1 | 匹配未包含的任意字符 |
[a-z] | 匹配指定范围内的任意字符 |
2 | 匹配任何不在指定范围内的任意字符 |
3、捕获分组、非捕获分组
字符 | 描述 |
---|---|
(pattern) | 匹配pattern并获取这一匹配 |
(?:pattern) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配 |
(?=pattern) | 在任何匹配pattern的字符串开始处匹配查找字符串 |
4、特殊字符
字符 | 描述 | |
---|---|---|
. | 匹配任何单词字符,除\n以外,要匹配包括“\n”在内的任何字符,请使用像“(. | \n)”的模式 |
\d | 匹配一个数字字符。等价于[0-9] | |
\D | 匹配一个数字字符。等价于[0-9] | |
\r | 匹配一个换行 | |
\s | 匹配任何空白字符 | |
\S | 匹配任何非空白字符 | |
\w | 匹配包括下划线的任何单词字符 | |
\W | 匹配任何非单词字符 | |
\t | 匹配一个制表符 | |
\W | 匹配任何非单词字符 |
5、选择匹配符
x|y 匹配x或y
6、常用正则表达式
作用 | 表达式 | |
---|---|---|
电子邮箱 | /^#?([a-f0-9]{6} | [a-f0-9]{3})$/ |
URL | /^(https?://)?([\da-z.-]+).([a-z.]{2,6})([/\w .-])/?$/ |
二、java中表达式的应用
java中对正则表达式的应用主要是两个类,下面是列出的一些常用方法,其中需要指明的是,这些都是静态方法。
1、Pattern类
compile(String regex) 将给定的正则表达式编译为Matcher。
matches(String regex, CharSequence input)直接匹配当前字符串
##### 2、Matcher类
find(int start) 查找是否存在匹配
group(int group) 获取匹配分组
matches() 匹配当前字符串
start() 匹配开始位置
end(int group) 匹配结束位置
replaceAll(String replacement) 匹配替换
三、实例
1、使用java的正则表达式的一个简单应用
要求:提取出{abc}中的内容
@Test
public void test11(){
String str = "知情同意书签署日期 {zqdate}";
String reg = "\\{+[a-z]?+\\}"; // /<0=表0—入排标准>/--[0,2]
//将规则封装成对象。
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.group());
}
}
1、再整一个难活
有这样一串字符串
仔细观察这段字符串是 a--a--a形式的 我要的是--部分,然后我这样写。
发现提取出来只有一部分。
仔细分析后发现,java默认是采用的贪婪模式。而这段字符串是 a--a--a形式的,它把我第
一个a和最后一个a当做是匹配的一整个。
解决这个问题也很简单,只需要这样写
在限定符*后面加一个?标识这是一个非贪婪模式,结果正常了,作为两部分返回了。

四、总结
相信读者能把这两个例子看懂正则表达式也能有一个初步的掌握,而成为一个正则表达式高手就需要靠你了。
掌握正则表达式一定要多写,只有写的多了才可以熟记于心,不会的多查阅文档。
学知识要知其然,知其所以然。
过去出问题了只会在百度搜索,然后在结果中一个个的尝试。
现在有问题了,一步步debug源码寻找问题的根源。希望读者都能逐渐转变学习方式。
即使看不懂源码的每一步,也能对整个过程有一个初步的认识,对于以后学习源码有极大的帮助。
有问题小伙伴们评论区见喔。