持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
1、写在前面
大家好,我是翼同学。今天文章的内容是:
- 正则表达式
2、内容
2.1、简介
(1) 前言
在了解什么是正则表达式之前,我们先来看两个问题:
- 当我们在填写电子邮箱的地址时,程序是如何判断本次输入的内容是否有效?
- 如何判断输入的电话号码是否是正确的格式?
像上述的问题所言,在实际生活中,我们不止要判断电子邮箱或者电话号码的格式正确与否,还可以是其他的信息。而正则表达式就是一种描述匹配规则进而匹配字符串的工具。
(2) 什么是正则表达式?
前面讲了,正则表达式可用于匹配字符串。而java已经内置了强大的正则表达式的支持。Java标准库的java.util.regex包内置了正则表达式引擎,我们可以在java程序中使用正则表达式。也就是说,只要我们编写完规则后,就可以利用正则表达式来判断目标字符串是否符合我们要求的规则。
(3) java.util.regex
java.util.regex包主要包括以下三个类:
-
Pattern类:pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法,我们需要调用公共静态编译方法来返回一个pattern对象(也就创建了一个Pattern对象)。 -
Matcher类:Matcher对象是对输入的字符串进行解释和匹配操作的引擎。同样的,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象。
PatternSyntaxException:PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
2.2、正则语法
(1) 前言
在了解正则匹配语法前,我们先清楚一件事情。在Java的字符串中,两个反斜杠其实是表示一个反斜线。这是因为Java语言的正则表达式需要有两个反斜杠才能被解析(转义)为一个反斜杠。
比如一段Java代码如下:
public class RegexDemo {
public static void main(String[] args) {
System.out.println("\\");
System.out.println("\\\\");
}
}
运行结果:
\
\\
这里我们举个例子,将正则表达式20\d\d转换为Java字符串就变成了20\\d\\d。因为在Java字符串中用\\表示\。
(2) 正则语法
字符类
下面语法都默认匹配一个字符。
| 语法 | 说明 |
|---|---|
[abc] | 字符集,匹配a或b或c |
[^abc] | 匹配除a、b、c之外的任何字符 |
[a-zA-Z] | 指定范围,匹配a到z或A到Z中的任意字符 |
[a-d[m-p]] | 指定范围,匹配a到d中的任意字符或者m到p的任意字符 |
[a-z&&[^bc]] | 指定范围,匹配a到z中的任意字符,除了b和c |
[a-z&&[^m-p]] | 指定范围,匹配a到z中的任意字符,除了m到p中的字符 |
预定义的字符类
预定义的字符类也是默认地匹配一个字符。语法如下:
| 语法 | 说明 |
|---|---|
. | 匹配任意一个字符 |
\d | 匹配任意一个数字,效果等同于[0-9] |
\D | 匹配任意一个非数字字符,效果等同于[^0-9] |
\s | 匹配一个空白字符,效果等同于[\t\n\f\r] |
\S | 匹配一个非空白字符,效果等同于[^\s] |
\w | 匹配英文、数字、下划线,效果等同于[a-zA-Z0-9] |
\W | 匹配一个非单词字符,效果等同于[^\w] |
\n | 匹配换行符 |
\r | 匹配回车符 |
\f | 匹配换页符 |
\t | 匹配制表符 |
量词
| 语法 | 说明 |
|---|---|
{n} | 表示正好匹配n次(n是非负整数) |
{n,} | 表示至少匹配n次(n是非负整数) |
{n,m} | 表示至少匹配n次,至多m次(m和n是非负整数,并且n≤m) |
? | 匹配零次或一次。效果等同于{0,1} |
* | 匹配零次或多次。效果等同于{0,} |
+ | 匹配一次或多次。效果等同于{1,} |
注意:
当字符?紧随任意其他限定符(如*、+、{n}等)之后时,匹配模式是非贪心的。非贪心的模式会匹配搜索到尽可能短的字符串,而在默认情况下,是"贪心的"模式,此时会匹配搜索到尽可能长的字符串。比如,a+?只匹配单个a,而a+会匹配所有a
(3) 举例
在Java中,字符串对象提供了匹配正则表达式规则的API,如下所示:
public boolean matches (String regex)
该方法用于判断字符串对象是否与给定的正则表达式regex匹配。如果匹配则返回true,否则返回false
下面举一些正则表达式的例子:
public class RegexDemo {
public static void main(String[] args) {
// 检验单个字符:
System.out.println("a".matches("[abc]")); //=> true
System.out.println("z".matches("[abc]")); //=> false (匹配到的字符只能是 a 或 b 或 c)
System.out.println("a".matches("[^abc]")); //=> false (匹配除 a b c之外的其他任意字符)
System.out.println("z".matches("[^abc]")); //=> true
System.out.println("a".matches("\d")); //=> false (a不是数字)
System.out.println("8".matches("\d")); //=> true
System.out.println("666".matches("\d")); //=> false (只能匹配一个数字)
System.out.println("a".matches("\w")); //=> true
System.out.println("2".matches("\w")); //=> true
System.out.println("我".matches("\w")); //=> false ("\w"只匹配英文、数字、下划线)
// 检查多个字符(使用量词):
// (1) 比如检查密码格式的是否正确,必须是数字,字母或下划线,至少有6位
System.out.println("123456".matches("\w{6,}")); //=> true
System.out.println("123456abc".matches("\w{6,}")); //=> true
System.out.println("123_abc".matches("\w{6,}")); //=> true
System.out.println("12abc".matches("\w{6,}")); //=> false
System.out.println("123$$$".matches("\w{6,}")); //=> false
System.out.println("123###".matches("\w{6,}")); //=> false
// (2) 检查验证码格式的正确性,必须是数字或字符,必须是4位
System.out.println("12ab".matches("[a-zA-Z0-9]{4}")); //=> true
System.out.println("12ab".matches("[a-zA-Z0-9]{4}")); //=> true
System.out.println("12_ab".matches("[a-zA-Z0-9]{4}")); //=> false
System.out.println("1_ab".matches("[a-zA-Z0-9]{4}")); //=> false
}
}
3、写在最后
好了,文章的内容就到这里,感谢观看。