元字符介绍
如果想要灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
1. 限定符
2. 选择匹配符
3. 分组组合和反向引用符
4. 特殊字符
5. 字符匹配符
6. 定位符
元字符—转义号 \
在Java的正则表达式中,两个\\代表其他语言中的一个\
需要用到转义符号的字符有一下:. * + ( ) & / \ ? [ ] ^ { }
元字符—字符匹配符
符号 | 含义 | 示例 | 解释 |
---|
[ ] | 可接收的字符列表 | [efgh] | e、f、g、h中的任意一个字符 |
[ ^ ] | 不可接收的字符列表 | [^abd] | 除a、b、c之外的任意一个字符 |
- | 连字符 | A-Z | 任意单个大写字母 |
符号 | 含义 | 示例 | 说明 | 匹配 输入 |
---|
. | 匹配除\n以外的任何字符 | a…b | 以a开头,以b结尾,中间包括2个任意字符长度为4的字符串 | aaab、a#*b |
\d | 匹配单个数字字符,相当于[0-9] | \d{3}(\d)? | 包含3个或4个数字的字符串 | 123、9876 |
\D | 匹配单个非数字字符,相当于[^0-9] | \D(\d)* | 以单个非数字字符开头,后接任意个数字字符串 | a、A123 |
\w | 匹配单个数字、大小写字母字符和下划线相当于[0-9a-zA-Z_] \d{3}\w{4} | 以3个数字字符开头的长度为7的数字字母字符串 | 234abcd | 12345Pe |
\W | 匹配单个非数字、大小写字母字符和下划线,相当于[^0-9a-zA-Z_] | \W+\d{2} | 以至少一个非数字字母字符开头,两个数字字符结尾的字符串 | #29、#?@10 |
补充:\s :匹配任何空白字符 \S:匹配任何非空白字符
注意:Java正则表达式默认是区分字母大小写的,如果想设置为不区分大小写,则有如下方式
1. (?i)abd 表示abc都不区分大小写 a(?i)表示bc不区分大小写 a((?i)b)c表示只有b不区分大小写
2. Pattern pat = Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
元字符—选择匹配符
在匹配某个字符串的时候是选择性的,即既可以匹配这个,也可以匹配那个
符号 | 含义 | 示例 | 解释 |
---|
| | 匹配"|"之前或之后的表达式 | ab|cd | ab或者cd |
元字符—限定符
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|
* | 指定字符重复0次或n次(无要求)0到多 | (abc)* | 仅包含abc的字符串, | abd、abcabcabc |
+ | 指定字符重复1次或n次(至少一次)1到多 | m+(abc)* | 以至少1个m开头,后接任意个abc的字符串 | m、mabc |
? | 指定字符重复0次或1次(最多一次) 0到1 | m+abc? | 以至少1个m开头,后接ab或abc的字符串 | mab、mabc |
{n} | 只能输入n个字符 | [abcd]{3} | 由abcd中字母组成的任意长度为3的字符 | abd、dbc |
{n,} | 指定至少 n 个匹配 | [abcd]{3,} | 由abcd中字母组成的任意长度不小于3的字符串 | aab、dbca |
{n,m} | 指定至少n 个但不多于 m 个匹配 | [abcd]{3,5} | 由abcd中字母组成的任意长度不小于3,不大于5的字符串 | abc、abcda |
元字符—定位符
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|
^ | 指定起始字符 | ^[0-9]+[a-z]* | 以至少一个数字开头,后接任意个小写字母的字符串 | 123/6aa |
$ | 指定结束字符 | ^[0-9]\\-[a-z]+$ | 以1个数字开头后接连字符“-”,并以至少一个小写字母结尾的字符串 | 1-a |
\\b | 匹配目标字符串的边界 | han\\b | 这里说的字符串的边界指的是子串有间隔或者是目标字符串的结束位置 | hanshunping sphan nnhan |
\\B | 匹配目标字符串的非边界 | han\\B | 和\\b的含义刚好相反 | hanshunping sphan nnhan |
分组
常用分组构造形式 | 说明 |
---|
(pattern) | 非命名捕获。捕获匹配的子字符串。编号为0的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则根据左括号的顺序从1开始自动编号。 |
(?<name>pattern) | 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号代替尖括号。 |
(?:pattern) | 匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“or”字符组合模式部件的情况很有用。例如industry(?:y|ies) 是比industry|industries更经济的表达式 |
(?=pattern) | 它是一个非捕获匹配。例如,Windows(?=95|98|NT|2000)匹配Windos2000中的Windows但不匹配Windows3.1中的Windows |
(?!pattern) | 该表达式与(?=pattern)相反,Windows(?!95|98|NT|2000)匹配Windows3.1中的Windows,但不匹配Windows2000中的Windows |
非贪婪匹配
默认情况下,Java中的正则匹配采用贪婪匹配,如果想更改为贪婪匹配,则需要在其他限定符后面添加一个'?'