java学习笔记(二十七)- 正则表达式

java学习笔记(二十七)- 正则表达式
执笔一、基本介绍
- 对字符串执行模式匹配的技术
- 全称 regular expression -> RegExp
二、元字符
1. 转义符
1 | \\转义符 |
字符 | 说明 |
---|---|
\ | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n"匹配字符"n”。“\n"匹配换行符。序列”\\\“匹配”\“,”\(“匹配”("。 |
1 | public class RegExp02 { |
2. 字符匹配符
2.1 匹配不区分大小写
1 | //(?i)abc表示abc都不区分大小写a // i表示大小写不敏感 |
2.2 字符匹配符列表
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
[ ] | 可接收的字符列表 | [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 | 匹配任意空白字符,包括空格、制表符、换页符等,相当于[\f\n\r\t\v] | ||
\S | 匹配任何非空白字符,相当于[ ^\f\n\r\t\v] | ||
\f | 换页匹配符,等效于\x0c 和 \cL | ||
\n | 换行匹配符,等效于\x0a 和 \cJ | ||
\r | 匹配一个回车符,等效于\x0d 和 \cM | ||
\t | 制表匹配符,等效于\x09 和 \cl | ||
\v | 垂直制表符匹配,等效于 |
1 | public class RegTheory { |
1 |
|
3. 选择匹配符
- 在匹配某个字符串的时候是选择性的
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
| | 匹配"|"之前或之后的表达式 | ab|cd | ab或cd |
1 | public class RegExp04 { |
4. 限定符
- 用于指定前面的字符和组合项连续出现的次数
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|---|---|---|---|
* | 指定字符重复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 |
{n} | 只能输入n个字符 | [abcd]{3} | 由abcd中字母组成的任意长度为3的字符串 | abc、acd、adc |
{n,} | 指定至少n个匹配 | [abcd]{3,} | 由abcd中字母组成的任意长度不小于3的字符串 | aab、dbc、aaabcd |
{n,m} | 指定至少n个但不多于m个匹配 | [abcd]{3,5} | 由abcd中字母组成的任意长度不小于3,不大于5的字符串 | abc、abcd、aaaaa、bcdaa |
1 | public class RegExp05 { |
5. 定位符
- 规定要匹配的字符串出现的位置
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|---|---|---|---|
^ | 指定起始字符 | [1]+[a-z]* | 以至少1个数字开头,后接任意个小写字母的字符串 | 123、6aa、555abc |
$ | 指定结束字符 | [2]\-[a-z]+$ | 以1个数字开头后接连字符"-"至少1个小写字母结尾的字符串 | 1-a |
\b | 匹配目标字符串的边界 | zb\b | 这里说的字符串的边界指的是子串间有空格,或者是目标字符串的结束位置 | lazb nhzb |
\B | 匹配目标字符串的非边界 | zb\B | 和\b的含义刚刚相反 | zbhh |
1 | public class RegExp06 { |
三、分组
- 使用圆括号组成一个比较复杂的匹配模式,一个圆括号()的部分可以看做是一个子表达式或者一个分组
1 | public class RegTheory { |
四、捕获
- 把正则表达式中的表达式或分组匹配的内容,保存到内存中以数字编号或显示命名的组里,从左向右,以分组的左括号作为标志,第一个出现的分组的组号为1,第二个为2,以此类推;组0表示整个正则表达式
1. 非命名捕获
常用分组构造形式 | 说明 | |
---|---|---|
(pattern) | 非命名捕获。捕获匹配的字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编号。 | |
(?:pattern) | 匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符(|)组合模式部件的情况很有用。例如,l(?:y|e)是比"ly|le"更好的表达式 | |
(?=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” | 相当于排除括号内的匹配 |
1 | public class RegExp08 { |
2. 命名捕获
常用分组构造形式 | 说明 |
---|---|
(? |
命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?‘name’) |
1 | public class RegExp07 { |
五、反向引用
- 圆括号的内容被捕获后,可以在这个括号后被使用,从而得到一个实用的表达式;内部反向引用用\ \表示分组号,外部反向引用用$表示分组号
1 | public class RegExp13 { |
六、匹配方式
1. 贪婪匹配
- 默认是贪婪匹配
2. 非贪婪匹配
- 在匹配符后加 ?
1 | public class RegExp09 { |
七、pattern类
-
pattern对象是一个正则表达式对象
-
pattern类没有公共构造方法,要创建一个pattern对象,调用其公共静态方法,返回一个pattern对象,该方法接受一个正则表达式作为它的第一个参数
1
Pattern pattern = new Pattern(regStr);//regStr 正则表达式字符串
1. matches方法
1 | public class Matches_ { |
八、Matcher类
1. 方法
1 | (1) public int start()//返回以前匹配的初始索引。 |
1 | public class MatcherMethod { |
九、String类
1 | public class StringReg { |
十、案例
1. 解析URL
1 | public class Homework03 { |
2. 匹配
1 | public class Homework02 { |
3. 验证邮箱
1 | public class Homework01 { |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果