0%

正则表达式

正则表达式

快速入门

快速、高效处理文本,是对字符串进行模式匹配的技术

正则表达式基本语法

  • 基本用法
1
2
3
4
5
6
7
8
9
10
11
12
// 需要匹配的文本内容
String str
// 创建一个Patter对象,可以理解成一个正则表达式对象
Pattern pa = Pattern.compile("\\d\\d\\d\\d");
// 创建一个匹配器对象
// matcher按照pattern模式到str中去匹配
// 匹配到的内容存放在matcher.group
Matcher matcher = pa.matcher(str);
// 可以开始循环匹配
while (matcher.find()){
System.out.println(matcher.group());
}

三个常用类

Pattern

正则表达式对象,没有公共构造方法,需要调用其公共静态方法返回一个Pattern对象。

Matcher

Matcher对象是对输入字符串进行解释和匹配的引擎,与Pattern类没有构造方法,需要调用matcher方法来获得对象。

  • matches() 尝试将整个区域与模式匹配
PatternSyntaxException

非强制异常类,表示一个正则表达式中的语法错误。

分组、捕获、反向引用

分组

用圆括号组成一个比较复杂的匹配模式,看作一个表达式/一个分组。

(pattern) 非命名捕获 (?pattern) 命名捕获

非捕获匹配 (?:pattern) 不存储供以后使用的匹配,常用在or (?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。 (?!pattern) 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。

捕获

把正则表达式中的子表达式或分组匹配的内容,保存到内存中以数字或显式命名的组里,用索引进行引用。

反向引用

圆括号的内容被捕获后,可以在这个括号中被使用。引用可以卸载正则表达式内部或外部,内部用\分组号,外部用$分组号。

元字符

限定符

用于指定其前面的字符和组合项连续出现的次数,遵守贪婪匹配(尽可能匹配多的)

* 指定字符重复0-n次 + 指定字符重复1-n次 ? 指定字符重复0 or 1次 {n} 只能输入n个字符 {n,}至少n个匹配 {n,m}至少n个但不多于m个匹配

选择匹配符
 在匹配字符串的时候是选择性的
分组组合和反向引用符号
特殊字符
字符匹配符号

[] 可接收的字符列表 [^] 不接收的字符列表 - 连字符 · 匹配除了· \\d 匹配单个数字,相当于[0-9] \\D 匹配单个非数字字符 \\w 匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z] \\W 匹配单个非数字、大小写字母字符
\\s 匹配任何空白字符 \\S 匹配任何非空白字符

定位符:规定要匹配的字符串出现的位置

^ 指定起始字符

$ 指定结束字符

\匹配目标字符串的边界(结束位置)

\\B 匹配目标字符串的非边界

String类中使用正则表达式

1
2
3
4
5
6
// 替换功能
str.replaceAll(regex, replacement);
// 判断功能
str.matches(regex)
// 分割功能
str.split(String regex)

应用实例

  • 实现不区分大小写:(?i)、CASE_INSENITIVE