首页 专题 文章 代码 归档
Java 正则表达式
2020.03.16 15:58 2020.03.16 15:58

1. 前言

什么是正则表达式?

用以处理文本的一种文本;

正则表达式有什么用?

基本上有两种用:

1、验证某些文本是否正确,如:手机号是否合法、QQ号是否合法,是否包括违禁词等等;

2、从父文本中提取自己需要的子文本;

所以,本文从正则表达式组成、验证文本、提取文本来讲解;

2. 组成

正则表达式之所以为正则表达式,是因为定义了一些特定的字符,这些字符表达特定的意思;

大致分为:常用元字符、表示次数的元字符、定位符;

2.1. 常用元字符

. 匹配除换行符外任意一个字符
[abc] 字符集合,只能表示一个字符位置。匹配所包含的任意一个字符
[^abc] 字符范围,只能表示一个字符位置,匹配除去所包含的任意一个字符
[a-z] 字符范围,也是个集合,表示一个字符位置匹配所包含的任意一个字符
[^a-z] 字符范围,也是个集合,表示一个字符位置匹配除去集合内字符的任意一个字符
\b 匹配单词的边界
\B 不匹配单词的边界
\d [0-9]匹配1位数字
\D [^0-9]匹配1位非数字
\s 匹配1位空白字符,包括换行符、制表符、空格[\f \r \n \t \v]
\S 匹配1位非空白字符
\w 匹配[a-zA-Z0-9_],包括中文
\W 匹配\w之外的字符

以上元字符如果是表示某个字符都表示一个字符,什么意思?比如\d表示0-9中任意一个字符,但也仅仅表示一个!

如果要表示多个,还需要和表示次数的元字符一起用;

2.2. 表示次数的元字符

符号 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

说明:比如\d只表示0-9中任意一个字符,但是如果是\d+表示可以获得一个0-9的数字也可以获得更多次的数字;

\d{n},表示值能匹配到连续的n个数字;

正则表达式在进行重复匹配时,默认是贪婪匹配模式,也就是说会尽量匹配更多内容,但是有的时候我们并不希望他匹配更多内容,这时可以通过?进行修饰来禁止重复匹配。

所以上面的例子:“但是如果是\d+表示可以获得一个0-9的数字也可以获得更多次的数字”,如果待匹配的是12312,那么到底是匹配多少呢?答案是12312全被匹配到,原因是默认是贪婪匹配模式

如何避免呢?

符号 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

也即加上在\d+的基础上加上一个?\d+?,当然,这在本例中是毫无意义的,因为\d+?匹配结果就等效于\d+了;

2.3. 定界符

光能匹配还不行,有时候我们还对字符出现的位置有要求!

比如我们要匹配以131开头的手机号,那么怎么写表达式?

^131\d{8},很简单是不是?^就是定界符!

符号 说明
^ 匹配字符串的开始
$ 匹配字符串的结束,忽略换行符

3. 验证功能

好了,讲了一些基本的正则表达式知识,那么在Java中,如何来使用呢?

Java中的正则表达式有两个类:MatcherPattern

它们都位于:java.util.regex包下;


上面的验证131手机号的代码:

public static void main(String[] args) {
    String phone = "13156987456";
    String phone2 = "12156987451";
    Pattern pattern = Pattern.compile("^131\\d{8}");
    Matcher matcher = pattern.matcher(phone);
    Matcher matcher2 = pattern.matcher(phone2);
    boolean b = matcher.find();
    boolean b2 = matcher2.find();
    System.out.println("b = " + b);//true
    System.out.println("b2 = " + b2);//false
}

验证功能其实很简单,就是根据元字符+表示次数的元字符(可选)+定界符(可选),然后去验证给定的字符串是否符合要求!

上面的代码说明:

1、Pattern类用来编译正则表达式,编译后得到Pattern对象,该对象可以多次使用;而pattern.matcher返回的是Matcher对象,该对象可以执行一些判断,如这里的find,当然,不止有find方法!

2、转义问题:在Java中,\代表要转义,所以如果要表达其本身,需要再来个\,这就是Pattern.compile("^131\\d{8}");里面的双斜杠的原因;

4. 提取功能

验证功能只是正则表达式中的常用作用之一,正则表达式还有一作用就是匹配我们想要的子串(子文本);

这里就要说到分组的概念,其实很简单,在需要分组的元字符的左右加上()即可!

如上面的例子:(131\d{8})就是,就可以提取到分组了:

public static void main(String[] args) {
    String phone = "13156987456安防监控了法角度看13156487987";
    Pattern pattern = Pattern.compile("(131\\d{8})");
    Matcher matcher = pattern.matcher(phone);
    while (matcher.find()) {
        String group = matcher.group(1);
        System.out.println("group = " + group);
    }
    /*group = 13156987456
    group = 13156487987*/
}

代码说明:

1、上面的正则表达式没有指定开头边界符^,所以能匹配到两个分组;

2、1315698745613156487987就是匹配出来的子串!因为它们属于父串的一部分!

本节阅读完毕! (分享
二维码图片 扫描关注我们哟