正则表达式简单使用
正则表达式基本语法
正则表达式是对字符串执行模式匹配的技术
正则表达式的元字符分类:
- 限定符
- 选择匹配符
- 分组组合和反向引用符
- 特殊字符
- 字符匹配符
- 定位符
转义号\\
在我们使用正则表达式去检索一些特殊的字符的时候,需要用到转义字符,否则检索不到我们匹配的结果,甚至会报错。在Java中\\
两个代表一个。
下面字符都需要使用转义字符:
* + () $ / \ ? [] ^ {}
符号 | 意义 | 实例 | 解释 |
---|---|---|---|
[] | 可接受的字符列表 | [ab] | a,b中任意一个字符 |
[^] | 不可接受的字符列表 | [^ab] | 除了a,b之外的任意一个字符 |
- | 连字符 | [a-z] | 任意单个小写字母 |
. | 匹配除换行符以外的任意字符 | a..b | 以a开头,b结尾,中间包含两个任意字符 |
\\d | 匹配单个数字,相当于[0-9] | \\d | 包含3个数字的字符串 |
\\D | 匹配单个非数字 | \\D\\d | 以任意单个非数字开头,后面跟一个数字 |
\\w | 匹配单个任意数字,大小写字母,下划线 | \\w | 任意的三个数字字母串 |
\\W | 匹配任意的单个非数字,大小写字母 | \\W | 任意的三个非数字字母串 |
\\s | 匹配任意空白字符 | ||
\\S | 匹配任意非空白字符 |
String content = "a123bhj23";
String regexp = "[a-z]";
//生成一个匹配模式对象
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
System.out.println("找到: " + matcher.group(0));
}
/*
找到: a
找到: b
找到: h
找到: j
*/
选择匹配符
| | 匹配"|"之前的表达式或者之后的表达式 | ab|bc | 匹配ab或者bc |
---|
限定符
符号 | 意义 | 实例 | 解释 |
---|---|---|---|
* | 重复0次或者n次 | (abc)* | 仅包含任意个abc字符串 |
+ | 指定字符串重复1次或者n次 | (abc)+ | 至少有一个abc的字符串 |
? | 重复0次或者1次 | (abc)? | 最多包含一个abc的字符串 |
包含n次 | (abc) | 包含2个abc字符串的字符串 | |
包含n次或者n次以上 | a | 包含两个a或者以上的字符串 | |
包含n到m次的字符串 | a | 包含两个或者三个a的字符串 |
定位符
符号 | 意义 | 实例 | 解释 |
---|---|---|---|
^ | 指定起始字符串 | ^a | 以a开头的字符串 |
$ | 指定结束字符串 | a$ | 以a结尾的字符串 |
\\b | 匹配目标字符串的边界 | han\\b | 边界指的是子串间有空格,或者是目标字符串结束的位置 |
\\B | 匹配目标字符串的非边界 | han\\B | 与上面相反 |
分组
String str = "hejing1234jk6789kkkks67829hjhhs8901n";
String regexp = "(\\d\\d)(\\d\\d)";
Pattern compile = Pattern.compile(regexp);
Matcher matcher = compile.matcher(str);
while(matcher.find()){
System.out.println("匹配到的字符串: " + matcher.group(0));
System.out.println("第一个分组: " + matcher.group(1));
System.out.println("第二个分组: " + matcher.group(2));
}
/*
匹配到的字符串: 1234
第一个分组: 12
第二个分组: 34
匹配到的字符串: 6789
第一个分组: 67
第二个分组: 89
匹配到的字符串: 6782
第一个分组: 67
第二个分组: 82
匹配到的字符串: 8901
第一个分组: 89
第二个分组: 01
*/
//命名分组
String str = "hejing1234jk6789kkkks67829hjhhs8901n";
String regexp = "(?<g1>\\d\\d)(?<g2>\\d\\d)";
Pattern compile = Pattern.compile(regexp);
Matcher matcher = compile.matcher(str);
while(matcher.find()){
System.out.println("匹配到的字符串: " + matcher.group(0));
System.out.println("第一个分组: " + matcher.group(1));
System.out.println("通过命名来获取第一个分组: " + matcher.group("g1"));
System.out.println("第二个分组: " + matcher.group(2));
System.out.println("通过命名来获取第二个分组: " + matcher.group("g2"));
}
特殊的分组
String context = "无涯子Java 无涯子PHP 无涯子Python";
String regexp = "无涯子Java|无涯子PHP|无涯子Python";
//可以简写成下面形式
String regexp2 = "无涯子(?:Java|PHP|Python)";//这种形式不能使用group(1)这类
//如果我只想捕获Java和PHP
String regexp3 = "无涯子(?=Java|PHP)";
//取反
String regexp4 = "无涯子(?!Java|PHP)";
Pattern compile = Pattern.compile(regexp4);
Matcher matcher = compile.matcher(context);
while(matcher.find()){
System.out.println(matcher.group(0));
}
默认是贪婪匹配模式,如果想要使用非贪婪模式,如下:
String content = "hell12345";
String regexp = "\\d+?";//在匹配模式后面加?,非贪婪模式
Pattern compile = Pattern.compile(regexp);
Matcher matcher = compile.matcher(content);
while(matcher.find()){
System.out.println(matcher.group(0));
}
/*
1
2
3
4
5
*/