目录
正则表达式
正则表达式
正则表达式就是一个描述规则的字符串,所以,只需要编写正确的规则,就可以让正则表达式引擎去判断目标字符串是否符合规则
正则表达式是一套标准,它可以用于任何语言。Java标准库的java.util.regex包内置了正则表达式引擎,在Java程序中使用正则表达式非常简单
(1)定义了字符串的模式,用字符串来描述规则,并用来匹配字符串。匹配规则:从左到右按规则匹配
(2)可以用来搜索、编辑或处理文本
(3)并不仅限于某一种语言,但是在每种语言中有细微的差别
在Java中,\\表示:插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义
Java中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在Java的正则表达式中,两个\\代表其他语言中的一个\,这也就是为什么表示一位数字的正则表达式是\\d,而表示一个普通的反斜杠是\\
java.util.regex包主要类(三个)
(1)Pattern类(Pattern.compile())
Pattern对象:一个正则表达式的编译表示,作用在于编译正则表达式后创建一个匹配模式
Pattern类没有public构造方法。要创建一个Pattern对象,必须首先调用其公共静态编译方法,返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数
// 要验证的字符串
String str = "service@xsoftlab.net";
// 邮箱验证规则
String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
// ①编译正则表达式
Pattern pattern = Pattern.compile(regEx);
// ②忽略大小写的写法
Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
// 使用Matcher对象,判断字符串是否与正则表达式相匹配
Matcher matcher = pattern.matcher(str);
boolean rs = matcher.matches();
静态方法
方法 | 描述 |
---|---|
static Pattern compile(String regex) | 将给定的正则表达式编译为模式 |
static Pattern compile(String regex, int flags) | 将给定的正则表达式编译为带有给定标志的模式 |
static boolean matches(String regex, CharSequence input) | 编译给定的正则表达式,并尝试匹配给定的输入 |
static String quote(String s) | 返回指定的String的文字模式String |
成员方法
方法 | 描述 |
---|---|
Matcher matcher(CharSequence input) | 创建一个匹配器,匹配给定的输入与此模式 |
int flags() | 返回此模式的匹配标志 |
String pattern() | 返回编译此模式的正则表达式 |
String[] split(CharSequence input) | 将给定的输入序列分成这个模式的匹配 |
String[] split(CharSequence input, int limit) | 将给定的输入序列分成这个模式 |
Stream splitAsStream(CharSequence input) | 根据给定的输入序列创建一个流,该流与该模式匹配 |
Predicate asPredicate() | 创建可用于匹配字符串的谓词 |
String toString() | 返回此模式的字符串表示形式 |
(2)Matcher类(Pattern.matcher())
Matcher对象:对字符串进行解释和匹配操作的引擎
Matcher类使用Pattern实例提供的模式信息对正则表达式进行匹配,与Pattern类一样,Matcher也没有公共构造方法。需要调用Pattern实例对象的matcher()来获得一个Matcher对象
// 要验证的字符串
String str = "baike.xsoftlab.net";
// 正则表达式规则
String regEx = "baike.*";
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx);
// 忽略大小写的写法
Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
// 查找字符串中是否有匹配正则表达式的字符/字符串
boolean rs = matcher.find();
成员方法
方法 | 描述 |
---|---|
boolean matches() | 对整个目标字符展开匹配检测。也就是只有整个目标字符串完全匹配时才返回true |
boolean lookingAt() | 将输入序列从区域开头开始与模式相匹配。只有匹配到的字符串在最前面才会返回true |
boolean find() | 尝试找到匹配模式的输入序列的下一个子序列 |
boolean find(int start) | 重新设置该匹配器,然后尝试从指定的索引开始找到匹配模式的输入序列的下一个子序列 |
int start() | 返回当前匹配到的字符串在原目标字符串中的位置 |
int start(int group) | 返回给定组在上一个匹配操作期间捕获的子序列的开始索引 |
int start(String name) | 返回给定捕获的子序列的初始索引named-capturing group以前的匹配操作期间 |
int end() | 返回最后一个字符匹配后的偏移量 |
int end(int group) | 返回在上次匹配操作期间由给定组捕获的子序列的最后一个字符之后的偏移量 |
int end(String name) | 返回给定捕获子序列的最后一个字符之后的偏移量named-capturing group以前的匹配操作期间 |
String group() | 返回匹配到的子字符串 |
String group(int group) | 返回在上一次匹配操作期间由给定组捕获的输入子序列 |
String group(String name) | 返回给定捕获的输入子序列named-capturing group以前的匹配操作期间 |
(3)PatternSyntaxException(异常)
PatternSyntaxException 是一个非强制异常类,表示一个正则表达式模式中的语法错误
PatternSyntaxException(String desc, String regex, int index) 构造一个这个类的新实例
方法 | 描述 |
---|---|
String getDescription() | 检索错误的描述 |
int getIndex() | 检索错误索引 |
String getMessage() | 返回一个多行字符串,其中包含语法错误及其索引的描述,错误的正则表达式模式以及模式中错误索引的可视指示 |
String getPattern() | 检索错误的正则表达式模式 |
通配符
模式 | 描述 |
---|---|
\w | 匹配字母、数字、下划线 |
\W | 匹配非字母、数字、下划线 |
\s | 匹配任意空白字符,相当于[\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,相当于[0-9] |
\D | 匹配非数字的字符 |
\A | 匹配字符串开头 |
\Z | 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结尾,如果存在换行,同时还会匹配换行符 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配一行字符串的开头 |
$ | 匹配一行字符串的结尾 |
. | 匹配任意字符,除了换行符 |
[^…] | 不在[]中的字符,比如[^abc]匹配除了a、b、c之外的字符 |
* | 匹配0个或多个表达式 |
+ | 匹配1个或多个表达式 |
? | 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式 |
() | 匹配括号内的表达式,也表示一个组 |
{n} | 精确匹配n个前面的表达式,比如\d{n},代表n个数字 |
{n,m} | 匹配n到m次由前面正则表达式定义的片段,贪婪方式 |
常用正则表达式
规则 | 正则表达式语法 |
---|---|
一个或多个汉字 | ^[\u0391-\uFFE5]+$ |
邮政编码 | ^[1-9]\d{5}$ |
QQ号码 | ^[1-9]\d{4,10}$ |
邮箱 | ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}.){1,3}[a-zA-z-]{1,}$ |
用户名 | ^[A-Za-z][A-Za-z1-9_-]+$ 字母开头+数字/字母/下划线 |
手机号码 | ^1[3|4|5|8][0-9]\d{8}$ |
URL | ^((http|https) : //)?([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$ |
18位身份证号 | ^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$ |