1、什么是正则表达式
一个正则表达式,就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用,不过,经过练习后,就觉得这些复杂的表达式写起来还是相当简单的,而且,一旦你弄懂它
们,你就能把数小时辛苦而且易错的文本处理工作缩短在几分钟(甚至几秒钟)内完成。
2、正则表达式的语法
正则表达式的分类
-
特殊字符(转义字符
'|'
) -
字符匹配符
-
选择匹配符
-
限定符
-
定位符
-
分组组合和反向引用符
3、元字符(Metacharacter
)
3.1转义号 \\
\\
符号说明:在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。
案例: 用$
去匹配 "abc("
会怎样?用(
去匹配"abc("
会怎样?
在
Java
的正则表达式中,两个\\
代表其他语言中的一个\
。
需要使用转义字符的场景
Java
. * + () $ / \ ? [] ^ {}
3.2、字符通配符
符号 | 符号说明 | 示例 | 解释 |
[] |
可接收的字符列表 | [efgh] |
e 、f 、g 、h 中的任意一个字符 |
[^] |
不可接收的字符列表 | [^abc] |
除a 、b 、c 之外的任意1字符,包括数字和特殊符号 |
- |
连字符 | A-Z |
任意单个大写字母 |
. |
匹配除\n 以外的任何字符 |
a..b |
以a 开头,b 结尾,中间包括2个任意字符长度为4的字符串 |
\\d |
匹配单个数字字符,相当于[0-9] |
\\d{3}(\\d)? |
包含3个或4个数字的字符串 |
\\D |
匹配非单个数字字符,相当于[^0-9] |
\\D(\\d)* |
以单个非数字字符开头,后接任意个数字字符串 |
\\w |
匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z] |
\\d{3}\\w{4} |
以3个数字字符开头的长度为7的数字字符串 |
\\W |
匹配非单个数字、大小写字母字符,相当于[^0-9a-zA-Z] |
\\W+\\d{2} |
以至少1个非数字字母字符开头,2个数字字符结尾的字符串 |
3.3、选择通配符|
在匹配某个字符串的时候是选择性的,即:既可以匹配这个,又可以匹配那个,这时你需要用到选择匹配符号(|)
。
符号 | 符号说明 | 示例 | 解释 |
` | ` | 匹配`" | "`之前或之后的表达式 |
3.4、限定符
符号 | 含义 | 示例 | 说明 | 匹配输入 |
* |
指定字符重复0次或n 次(无要求,零到多) |
(abc)* |
仅包含任意个abc 的字符串,等效于\w* |
abc abcabcabc |
+ |
指定字符重复1次或n 次(至少一次,1到多) |
m+(abc)* |
以至少1个m 开头,后接任意个abc 的字符串 |
m mabc mabcabc |
? |
指定字符重复0次或1次(最多一次,0到1) | m+abc? |
以至少1个m 开头,后接ab 或abc 的字符串 |
mab mabc mmabc |
{n} |
只能输入n 个字符 |
[abcd]{3} |
由abcd 中字母组成的任意长度为3的字符串 |
abc dbc adc |
{n,} |
指定至少n 个匹配 |
[abcd]{3,} |
由abcd 中字母组成的任意长度不小于3的字符串 |
aab dbc aaabdc |
{n,m} |
指定至少n 个但不多于m 个匹配 |
[abcd]{3,5} |
由abcd 中字母组成的任意长度不小于3,不大于5的字符串 |
abc abcd aaaaa bcdab |
3.5、定位符
符号 | 含义 | 示例 | 说明 | 匹配输入 |
^ |
指定起始字符 | ^[0-9]+[a-z]* |
以至少1个数字开头,后接任意个小写字母的字符串 | 123 |
$ |
指定结束字符 | ^[0-9]\\-[a-z]+$ |
以一个数字开头后接连接符"-" ,并以至少1个小写字母结尾的字符串 |
m mabc mabcabc |
\\b |
匹配目标字符串的边界 | abc\\b |
这里说的字符串的边界指的是子串间有空格,或者是目标字符串的结束位置 | cabcd cabc ccabc |
\\B |
匹配目标字符串的非边界 | abc\\B |
和\\b 的含义刚刚相反 |
cabcd cabc ccabc |
3.6、分组
常用分组构造形式 | 说明 |
(pattern) |
非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编号。 |
(?<name>pattern) |
命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如:(?'name') |
(?:pattern) |
匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存 储供以后使用的匹配。这对于用"or" 字符`( |
(?=pattern) |
它是一个非捕获匹配。例如,`'Windows (?=95 |
`(? | pattern)` |
3.7、修饰符
符号 | 含义 | 示例 | 说明 | 匹配输入 |
i |
不区分大小写 | 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别 |
123 | |
g |
全局匹配 | abc/g |
查找所有的匹配项 | Google abc tana abc |
m |
多行匹配 | ^abc/gm |
使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾 |
abcdf taobao abccc |
s |
特殊字符圆点 . 中包含换行符 \n |
/abc./s |
默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后,. 中包含换行符 \n |
wert abc cba |