目录
想要灵活的运用正则表达式,必须了解各种元字符的功能。元字符从功能上大致分为:限定符、选择匹配符、分组组合和反向引用符、特殊字符、字符匹配符、定位符。
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"。