基本介绍
如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
- 限定符
- 选择匹配符
- 分组组合和反向引用符
- 特殊字符
- 字符匹配符
- 定位符
元字符(Metacharacter)-转义号 \\
\\符号 说明: 在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。
在JAVA语言中,两个\\代表其他语言中的一个\
需要用到转义符号的字符有以下:. * + ( ) $ / \ ? [ ] ^ { }
元字符-字符匹配符
| 符号 |
符号 |
实例 |
解释 |
匹配输入 |
| [ ] |
可接收的字符列表 |
[efgh] |
e f g h中的任意一个字符 |
|
| [^] |
不接收的字符列表 |
[^abc] |
除a b c之外的任意一个字符,包括数字和特殊字符 |
|
| - |
连接符 |
A-Z |
任意单个大写字母 |
|
| . |
匹配除\n以外的任何字符 |
a..b |
以a开头,b结尾,中间包括2个任意字符的长度为4的字符串 |
aaab、aefb、a35b、a#*b |
| \\d |
匹配单个数字字符,相当于[0-9] |
\\d{3}(\\d)? |
包含3个或4个数字的字符串 |
123、9876 |
| \\D |
匹配单个非数字字符,相当于[^0-9] |
\\D(\\d)* |
以单个非数字字符开头,后接任意个字符串 |
a、A342 |
\\w |
匹配单个数字、大小写字母字符相当于[0-9a-zA-Z_] |
\\d{3}\\w{4} |
以3个数字字符开头的长度为7的数字字母字符串 |
234abcd、12345pe |
\\W |
匹配单个非数字、大小写字母字符相当于[^0-9a-zA-Z] |
\\W+\\d{2} |
以至少1个非数字字母字符开头,2个数字字符结尾的字符串 |
#29、#?@10 |
\\s |
匹配任何空白字符(空格,制表符等) |
|
|
|
\\S |
匹配任何非空白字符,和\s相反 |
|
|
|
应用实例
[a-z]说明:[a-z] 表示可以匹配a-z中任意一个字符,比如[a-z] 、 [A-Z] 去匹配 a11c8会得到什么结果?
1 2 3 4 5 6 7 8 9 10 11
| String content = "a11c8": String regStr = "[a-z]"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 找到 a 找到 c
|
1 2 3 4 5 6 7 8 9 10
| String content = "a11c8": String regStr = "[A-Z]"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 空
|
java正则表达式默认是区分字母大小写的,如何实现不区分大小写
1 2 3 4 5 6 7 8 9 10 11
| String content = "a11c8abcABC": String regStr = "(?i)abc"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 找到 abc 找到 ABC
|
- a(?i)bc 表示bc不区分大小写
- a((?i)b)c 表示只有b不区分大小写
- Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
[^a-z]说明:[^a-z] 表示可以匹配不是a-z中的任意一个字符,比如
我们看看 [^a-z] 去匹配 a11c8 会得到什么结果? 用[^a-z]{2} 又会得到什么结果呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| String content = "a11c8abcABC": String regStr = "[^a-z]"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 找到 1 找到 1 找到 8 找到 A 找到 B 找到 C
|
元字符-选择匹配符
在匹配某个字符串的时候是选择性的,即: 既可以匹配这个,又可以匹配那个,这时你需要用到 选择匹配符号
| 符号 |
符号 |
示例 |
解释 |
| | |
匹配` |
`之前或之后的表达式 |
ab|cd |
元字符-限定符
用于指定其前面的字符和组合项连续出现多少次
| 符号 |
含义 |
示例 |
说明 |
匹配输入 |
| * |
指定字符重复0次或n次 |
(abc)* |
仅包含任意个abc的字符串,等效于\w* |
abc、abcabcabc |
| + |
指定字符重复1次或n次(至少一次) |
m+(abc)* |
以至少1个m开头,后接任意个abc的字符串 |
m、mabc、mabcabc |
| ? |
指定字符重复0次或1次(最多一次) |
m+abc? |
以至少1个m开头,后接ab或abc的字符 |
mab、mabc、mmmab、mmabc |
| {n} |
只能输入n个字符 |
[abcd]{3} |
由abcd中字母组成的任意长度为3的字符串 |
abc、adc、dbc |
| {n,} |
指定至少n个匹配 |
[abcd]{3,} |
由abcd中字母组成的任意长度不小于3的字符串 |
aab、dbc、aaabdc |
| {n,m} |
指定至少 n 个但不多于 m 个匹配 |
[abcd]{3,5} |
由abcd中字母组成的任意长度不小于3不大于5的字符串 |
abc.abcd.、aaaaabcdab |
实例
- 1{3}去匹配1111111的话,会得到什么结果呢?
1 2 3 4 5 6 7 8 9 10 11
| String content = "1111111aaahello": String regStr = "1{3}"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 找到 111 找到 111
|
- 1{3,4}去匹配1111111的话,会得到什么结果呢?
1 2 3 4 5 6 7 8 9 10 11
| String content = "1111111aaahello": String regStr = "1{3,4}"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 找到 1111 找到 111
|
java匹配默认贪婪匹配,尽可能匹配多的
- 1+去匹配1111111的话,会得到什么结果呢?
1 2 3 4 5 6 7 8 9 10
| String content = "1111111aaahello": String regStr = "1+"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 找到 1111111
|
元字符-定位符
定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置
| 符号 |
含义 |
示例 |
说明 |
匹配输入 |
| ^ |
指定起始字符 |
^[0-9]+[a-z] |
以至少1个数字开头,后接任意个小写字 母的字符串 |
123、6aa、555edf |
| $ |
指定结束字符 |
^[0-9]\\-[a-z]+$ |
以1个数字开头后接连字符“-”,并以至少1个小写字母结尾的字符串 |
1-a |
\\b |
匹配目标字符串的边界 |
han\\b |
这里说的字符串的边界指的是子串间有空格,或者是目标字符串的结束位置 |
hanshunpingsphan nnhan |
| \B |
匹配目标字符串的非边界 |
han\\B |
和\b的含义相反 |
hanshunpingsphan nnhan |
实例
- ^,$使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| String content = "123abc": String regStr = "^[0-9]+[a-z]*"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 找到 123abc String content = "a123abc": String regStr = "^[0-9]+[a-z]*"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); }
空 String content = "123abc12": String regStr = "^[0-9]+[a-z]*"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 找到 123abc String content = "123abc": String regStr = "^[0-9]+[a-z]+$"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); }
找到 123abc String content = "123abc1": String regStr = "^[0-9]+[a-z]+$"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); } // 输出 空
|
分组
| 常用分组构造形式 |
说明 |
| (pattern) |
非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编 |
| (?pattern) |
命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?’name’) |
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| String content = "abc1234": String regStr = "(\\d\\d)(\\d)(\\d)"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content): while (matcher.find()){ System.out.println("找到 + matcher.group(0)); System.out.println("找到第一个分组内容 + matcher.group(1)); System.out.println("找到第二个分组内容 + matcher.group(2)); System.out.println("找到第三个分组内容 + matcher.group(3)); }
找到 1234 找到第一个分组内容 12 找到第二个分组内容 3 找到第三个分组内容 4
|
特别分组
| 常用分组构造形式 |
说明 |
| (?pattern) |
匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用”or”字符(组合模式部件的情况很有用。例如,”industr(?:ylies) 是比industrylindustries’更经济的表达式。 |
| (?=pattern) |
它是一个非捕获匹配。例如,Vindows(?=95|98|NT|2000)’匹配”Vindows2000”中的”Windows”,但不匹配”Windows3.1”中的’Windows” |
| (?!pattern) |
该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。它是一个非捕获匹配。例如,Vindows(?!9598NT|2000)’匹配”Windows3.1”中的”Windows”,但不匹配”Vindows2000”中的”Windows”。 |