【Java】:正则表达式的使用

101 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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对象。

PatternSyntaxExceptionPatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

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]字符集,匹配abc
[^abc]匹配除abc之外的任何字符
[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次(mn是非负整数,并且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、写在最后

好了,文章的内容就到这里,感谢观看。