正则表达式简单使用

正则表达式基本语法

正则表达式是对字符串执行模式匹配的技术
正则表达式的元字符分类:

  • 限定符
  • 选择匹配符
  • 分组组合和反向引用符
  • 特殊字符
  • 字符匹配符
  • 定位符

转义号\\

在我们使用正则表达式去检索一些特殊的字符的时候,需要用到转义字符,否则检索不到我们匹配的结果,甚至会报错。在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
*/
posted @ 2021-10-08 10:41  无涯子wyz  阅读(66)  评论(0)    收藏  举报