正则表达式
正则表达式(regular expression)是文本处理的利器
三个常用类
Pattern类
pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一个Pattern对象,调用其公共静态方法,它返回一个Pattern对象。该方法接收一个正则表达式作为它的第一个参数
Pattern pattern = Pattern.compile(reg);
常用方法
-
matches(reg,content) 整体匹配
public static void main(String[] args) { String content = "13888888888"; String reg = "1[3579]\\d{9}";//不需要加定位符,整体匹配 System.out.println(Pattern.matches(reg,content)?"满足手机号":"不满足手机号"); }
Matcher类
Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern一样,Matcher也没有公共构造方法。需要调用Pattern对象的matcher方法来获得一个Matcher对象
Matcher matcher = pattern.matcher(url);
常用方法
方法 | 说明 |
---|---|
public int start() | 返回以前匹配的初始索引 |
public int start (int group) | 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引 |
public int end() | 返回最后匹配字符之后的偏移量 |
public int end(int group) | 返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量 |
public boolean lookingAt() | 尝试将从区域开头开始的输入序列与该模式匹配 |
public boolean find() | 尝试查找与该匹配模式匹配的输入序列的下一个子序列 |
public boolean find(int start) | 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列 |
public boolean matches() | 尝试将整个区域与模式匹配 |
public String replaceAll(String replacement) | 替换模式与给定替换字符串相匹配的输入序列的每个子序列 |
PatternSyntaxException类
该类是一个非强制异常类,他表示一个正则表达式模式中的语法错误
分组、捕获、反向引用
分组
我们可以用圆括号组成一个比较复杂的匹配模式那么一个圆括号的部分可以看作是一个子表达式/分组
常用分组构造形式 | 说明 |
---|---|
(pattern) | 非命名捕获。捕获匹配的字符串。编号为0的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则根据左括号的顺序从1开始自动编号 |
(?pattern | 命名捕获。将匹配的字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且 不能以数字开头。可以使用单引号代替尖括号例如(?‘name’) |
(?:pattern) | 匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储以后使用的匹配。这对于用“or”字符(|)组合模式部件的情况很有用。例如,industr(?:y|ies)是比industry|industries更经济的表达式 |
(?=pattern) | 它是一个非捕获匹配,只匹配前缀。例如Windows(?=95|98|NT|2000)匹配“Windows 2000”中的Windows 但不匹配“Windows 11”中的Windows |
(?!pattern) | 该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。它是一个非捕获匹配。例如Windows(?!95|9|NT|2000)匹配“Windows 11”中的Windows但不匹配“Windows 2000”中的Windows |
捕获
把正则表达式中子表达式/分组匹配的内容保存到内存中,以数字标号或显示命名的组里,方便后面引用,从左到右,以分组的左括号为标志,第一个出现的分组组号为1,第二个为2,以此类推。组0表示整个正则式
反向引用
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我门称之为反向引用,这种引用既可以是在正则表达式内部,也可以在正则表达式外部,内部反向引用\\分组号,外部反向引用$分组号
元字符
元字符从功能上大致分为
- 限定符
- 选择通配符
- 分组组合和反向引用符
- 特殊字符
- 字符匹配符
- 定位符
元字符-转义号 \\
\\符号 说明:在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义字符,否则检索不到结果,甚至会报错。注:在java的正则表达式中,两个\\代表其它语言中的一个\
需要用到转移符号的字符有以下:. * + () $ / \ ? [] ^ {}
元字符-字符匹配符
符号 | 符号 | 示例 | 解释 |
---|---|---|---|
[] | 可接收的字符列表 | [efgh] | e、f、g、h中的任意一个字符 |
[^] | 不接收的字符列表 | [^abc] | 除了abc之外的任意一个字符,包括数字和特殊字符 |
- | 连字符 | A-Z | 任意单个大写字母 |
. | 匹配除\n(换行符)以外 的任意字符 | a…b | 以a开头以b结尾中间包含两个任意字符的字符串(a#cb) |
\\d | 匹配单个数字字符相当于[0-9] | \\d{3}(\d)? | 包含3个或4个数字的字符串 |
\\D | 匹配单个非数字字符 [^0-9] | \\D(\\d)* | 以非数字开头后面接任意长度数字的字符串 |
\\w | 匹配单个数字、大小写字母字符(包括下划线)相当于[a-zA-Z0-9_] | \\d{3}\w{4} | 以三个数字开头长度为7的数字字母组合字符串 |
\\W | 匹配单个非数字、大小写字母的字符相当于[^0-9a-zA-Z_] | \\W+\\d{2} | 以至少一个非数字字母开头2个数字字符结尾的字符串(@12) |
\\s | 空白。匹配任何空白字符,包括空格和制表符 | \\w\\s\\w | 两个数字字母字符中间夹着空格 |
\\S | 非空白。匹配任何非空白字符 | a\\S* | a开头后面接任意非空白字符 |
如何不区分大小写匹配
方法一:(?i)abc 表示匹配“abc”不区分大小写
方法二:
Pattern pattern = Pattern.compile(reg,Pattern.CASE_INSENSITIVE);
元字符-选择匹配符
在匹配某个字符串的时候是选择性的,即:既可以匹配这个,又可以匹配那个,这时你需要用到选择匹配符 |
符号 | 符号 | 示例 | 解释 |
---|---|---|---|
| | 匹配“|“之前或者之后的表达式 | ab|cd | ab或者cd |
元字符-限定符
用于指定其前面的字符和组合项出现多少次
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|---|---|---|---|
* | 指定字符重复0次或多次 | (abc)* | 仅包含任意个abc的字符串 | abc、abcabc |
+ | 指定字符重复1次或多次(至少一次) | m+(abc)* | 以至少一个m开头后接任意个abc | mabc、mmabcabc |
? | 指定字符重复0次或1次(最多一次) | m+abc? | 以至少一个m开头后接ab或者abc的字符串 | mab、mabc |
{n} | 指定重复n次 | [abcd]{3} | 由abcd中的字母组成的长度为3的字符串 | abc、ccc |
{n,} | 指定至少重复n次 | [abcd]{3,} | 由abcd中的字母组成的长度不小于3的字符串 | aaaa,ddc |
{n,m} | 重复次数在n和m之间[n,m] | [abcd]{3,5} | 由abcd中的字母组成的长度不小于3,不大于5的字符串(默认贪婪匹配:尽可能匹配多的,可接?取消贪婪匹配 例如[abcd]{3,5}?) | aaaaa,dbcb |
元字符-定位符
定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置。
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|---|---|---|---|
^ | 指定起始字符 | 1+[a-z]* | 以至少一个数字开始后面接任意个字母 | 1aaaa、123nnn |
$ | 指定结束字符 | ^\\d\\-[a-z]+$ | 以一个数字开头接连接字符”-“并以至少一个小写字母结尾 | 1-a、2-jiji |
\\b | 匹配目标字符串的边界 | han\\b | 这里说的字符串的边界指的是字符串间有空格,或者是目标字符串的结束位置 | hanjasid(无法匹配)、sphan nnhan |
\B | 匹配目标字符串的非边界 | han\\B | 和\b的含义相反 | hanhasu(可以匹配) |
0-9 ↩︎