Java——正则表达式
1、什么是正则表达式
一个正则表达式,就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用,不过,经过练习后,就觉得这些复杂的表达式写起来还是相当简单的,而且,一旦你弄懂它
们,你就能把数小时辛苦而且易错的文本处理工作缩短在几分钟(甚至几秒钟)内完成。
2、正则表达式的语法
正则表达式的分类
-
特殊字符(转义字符
'|'
) -
字符匹配符
-
选择匹配符
-
限定符
-
定位符
-
分组组合和反向引用符
3、元字符(Metacharacter
)
3.1转义号 \\
\\
符号说明:在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。
案例: 用$
去匹配 "abc("
会怎样?用(
去匹配"abc("
会怎样?
在
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、选择通配符|
在匹配某个字符串的时候是选择性的,即:既可以匹配这个,又可以匹配那个,这时你需要用到选择匹配符号(|)
。
符号 | 符号说明 | 示例 | 解释 |
| | 匹配"|" 之前或之后的表达式 | ab|cd | ab 或者cd |
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" 字符(|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) ' 是比'industry|industries' 更经济的表达式。 |
(?=pattern) | 它是一个非捕获匹配。例如,'Windows (?=95|98|NT|2000)' 匹配 "Windows 2000" 中的"Windows" ,但不匹配"Windows 3.1" 中的 "Windows" 。 |
(?|pattern) | 该表达式匹配不处于匹配pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配。例如,'Windows (?!95|98|NT|2000)' 匹配 "Windows 3.1" 中的"Windows" ,但不匹配"Windows 2000" 中的 "Windows" 。 |
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 |