目录
想要灵活的运用正则表达式,必须了解各种元字符的功能。元字符从功能上大致分为:限定符、选择匹配符、分组组合和反向引用符、特殊字符、字符匹配符、定位符。
1. 转义号\\
(1)在使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。
(2)在Java的正则表达式中,两个\\代表其他语言中的一个\。
(3)需要用到转义符的字符有:* + ( ) $ / \ ? [ ] ^ { }
2. 字符匹配符
(1)符号一览
符号 |
含义 |
示例 |
解释 |
[] |
可接收的字符列表,也可以放入各种符号,来匹配符号本身 |
[efgh] [&%#] |
匹配e、f、g、h中的任意一个字符;匹配&、%、#中的任意一个字符 |
[^] |
不接收的字符列表 |
[^abc] |
除a、b、c之外的任意一个字符,包括数字和特殊符号 |
- |
连字符 |
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个数字字符结尾的字符串 |
\\s |
匹配任何空白字符(空格、制表符等) |
\\s |
|
\\S |
匹配任何非空白字符 |
\\S |
(2)Java的正则表达式默认是区分字母大小写的,需要通过(?i)符号,或创建Pattern对象时,调用CASE_INSENSITIVE实现不区分字母大小写。
例:
①(?i)abc 表示abc都不区分大小写
②a(?i)bc 表示bc不区分大小写
③a((?i)b)c 表示只有b不区分大小写
④Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
3. 选择匹配符
(1)在匹配某个字符串时是选择性的,即:既可以匹配这个,又可以匹配那个。
(2)选择匹配符|,匹配“|”之前或之后的表达式。如ab|cd,表示ab或cd。
4. 限定符
用于指定前面的字符和组合项连续出现多少次。(注:Java匹配默认是贪婪匹配,即尽可能匹配多的数)
符号 |
含义 |
示例 |
解释 |
* |
指定字符重复0次或n次 |
(abc)* |
仅包含任意个abc的字符串,等效于\w* |
+ |
指定字符重复1次或n次(至少一次) |
m+(abc)* |
以至少1个m开头,后接任意个abc的字符串 |
? |
指定字符重复0次或1次(至多一次) |
m+abc? |
以至少1个m开头,后接ab或abc的字符串 |
{n} |
只能输入n个字符 |
[abcd]{3} |
由abcd中字母组成的任意长度为3的字符串 |
{n,} |
指定至少n个匹配 |
[abcd]{3,} |
由abcd中字母组成的任意长度不小于3的字符串 |
{n,m} |
指定至少n个但不多于m个匹配 |
[abcd]{3,5} |
由abcd中字母组成的任意长度不小于3,不大于5的字符串 |
如果要实现“非贪婪匹配”,就在限定符最后加一个?号。如 \\d+? 就可以每次只匹配一个符号。
5. 定位符
定位符规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置。
符号 |
含义 |
示例 |
解释 |
^ |
指定起始字符 |
^[0-9]+[a-z]* |
以至少1个数字开头,后接任意个小写字母的字符串 |
$ |
指定结束字符 |
^[0-9]\\-[a-z]+$ |
以1个数字开头后接连字符-,并以至少1个小写字母结尾的字符串 |
\\b |
匹配目标字符串的边界(指子串间有空格,或目标字符串的结束位置) |
han\\b |
匹配字符串中 空格前或结束时的han (如han111han 234han) |
\B |
匹配目标字符串的非边界 |
han\\B |
和\b的含义相反 (如han111han 234han) |
6. 分组
6.1 常用分组
①(pattern) 非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编号。
②(?<name>pattern) 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?'name')。
在使用matcher.group()获取指定字符串内容时,就可以直接使用组名来获取matcher.group("name")。
6.2 特别分组
①(?:pattern) 匹配pattern但不捕获该匹配的子表达式,即是一个非捕获匹配,不存储供以后使用的匹配。这对于用 "or" 字符 (|) 组合模式部件的情况很有用。例如 'industr(?:y|ies)'是比'industry|industries'更经济的表达式。
②(?=pattern) 匹配处于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"。