正则表达式是用于匹配、查找和操作文本的强大工具,通过定义特定模式来描述文本规则。
一、基础语法
(一)字符匹配
普通字符:直接匹配对应字符本身。例如,正则表达式
abc
能匹配字符串 “abc”,因为它精确匹配了这三个连续的字符。元字符:具有特殊含义的字符。例如,
.
匹配除换行符\n
之外的任意单个字符。正则表达式a.c
可以匹配 “abc”、“a1c”、“a c” 等,只要中间字符是单个任意字符(除\n
外)。
(二)字符类
- **方括号
[]
**:定义一个字符集合,匹配其中任意一个字符。例如,[abc]
可以匹配 “a”、“b” 或 “c”。还能使用范围表示,如[a - z]
匹配任意小写字母,[0 - 9]
匹配任意数字。 - **否定字符类
[^]
**:匹配不在方括号内的任意一个字符。例如,[^abc]
可以匹配除 “a”、“b”、“c” 之外的任何字符。
(三)数量限定符
- **
\*
**:匹配前面的元素零次或多次。例如,a*
可以匹配空字符串,也可以匹配 “a”、“aa”、“aaa” 等任意多个 “a” 组成的字符串。 - **
+
**:匹配前面的元素一次或多次。例如,a+
至少匹配一个 “a”,能匹配 “a”、“aa”、“aaa” 等,但不能匹配空字符串。 - **
?
**:匹配前面的元素零次或一次。例如,a?
可以匹配空字符串或 “a”。 - **
{n}
**:匹配前面的元素恰好n
次。例如,a{3}
只能匹配 “aaa”。 - **
{n,}
**:匹配前面的元素至少n
次。例如,a{3,}
能匹配 “aaa”、“aaaa”、“aaaaa” 等。 - **
{n,m}
**:匹配前面的元素至少n
次,最多m
次。例如,a{2,4}
可以匹配 “aa”、“aaa”、“aaaa”。
二、边界匹配
- **
^
**:匹配字符串的开头。例如,^abc
只会匹配以 “abc” 开头的字符串,如 “abcdef”,而不会匹配 “defabc”。 - **
$
**:匹配字符串的结尾。例如,abc$
只会匹配以 “abc” 结尾的字符串,如 “defabc”,而不会匹配 “abcdef”。 - **
\b
**:匹配单词边界,即单词和非单词字符的分界处。例如,\bcat\b
可以匹配 “the cat is here” 中的 “cat”,但不会匹配 “category” 中的 “cat”。
三、分组与捕获
- **分组
()
**:将多个字符作为一个整体进行操作。例如,(ab)+
表示 “ab” 整体出现一次或多次,可以匹配 “ab”、“abab”、“ababab” 等。 - 捕获组:括号内的表达式会被捕获,可以在后续通过索引(从 1 开始)来引用。例如,对于正则表达式
(a)(b)
,在匹配 “ab” 后,group(1)
会返回 “a”,group(2)
会返回 “b”。
四、示例分析
假设要从字符串 “USD:352677,33.00” 中提取出 “USD” 和 “352677,33.00” 两部分,使用正则表达式 ([A-Z]{3}):(\\d{1,3}(,\\d{3})*\\.\\d{2})
。
- **
([A-Z]{3})
**:这是第一个捕获组,[A-Z]
表示所有大写字母的字符类,{3}
限定前面的字符类要出现 3 次,所以它会匹配到 “USD” 这样的三位大写字母组合,通过group(1)
可获取 “USD”。 - **
:
**:匹配字符串中的冒号。 - **
(\\d{1,3}(,\\d{3})\*\\.\\d{2})
**:这是第二个捕获组,\\d{1,3}
匹配金额整数部分开头的 1 到 3 位数字,(,\\d{3})*
匹配可能存在的千分位分隔符及后续 3 位数字,*
表示可以有零个或多个这样的组合,\\.\\d{2}
匹配小数点及后面两位数字。整体匹配 “352677,33.00” 这样格式的金额,通过group(2)
可获取该金额字符串。