Java正则表达式详解(语法示例用法大全)

Java正则表达式详解(语法示例用法大全)-mikechen

Java正则表达式简介

正则表达式,英文名regular expression(简写为regex),是一种被用于从文本中检索符合某些特定模式的文本,是描述一种字符串匹配的格式。

 

Java正则表达式应用场景

1.正则表达式通常被用于字符串匹配和替换

用来检查某一字符串是否满足某一格式,比如:

String中的matches(String regex)

判断字符串是否匹配给定的正则表达式,返回布尔值。

2.正则表达式也可以应用于常见的web表单验证

比如:

1)比如网站要求你输入的QQ号为5~12位数字

2)电话号码必须是020-12345678或者手机号码:15028772888的字符串

3)比如Email邮箱验证

4)比如过滤关键字或者过滤HTML标签

5)比如发表评论的时候只允许中文评论

6)比如去除字符串首尾空格

 

Java正则表达式语法

1.字符的取值范围

1.[abc] : 表示可能是a,可能是b,也可能是c。
2.[^abc]: 表示不是a,b,c中的任意一个。
3.[a-zA-Z]: 表示是英文字母。
4.[0-9]:表示是数字简洁的字符表示。

2.匹配任意的字符

.:匹配任意的字符。
\d:表示数字。
\D:表示非数字。
\s:表示由空字符组成[ \t\n\r\x\f]。
\S:表示由非空字符组成[^\s]。
\w:表示字母、数字、下划线[a-zA-Z0-9_]。
\W:表示不是由字母、数字、下划线组成。

3.数量表达式

1.?: 表示出现0次或1次。
2.+: 表示出现1次或多次。
3.*: 表示出现0次、1次或多次。
4.{n}:表示出现n次。
5.{n,m}:表示出现n~m次。
6.{n,}:表示出现n次或n次以上。

4.逻辑表达式

1.XY: 表示X后面跟着Y,这里X和Y分别是正则表达式的一部分。
2.X|Y:表示X或Y,比如”food|f”匹配的是foo(d或f),而”(food)|f”匹配的是food或f。
3.(X):子表达式,将X看做是一个整体。

 

常见的正则表达式

规则 正则表达式语法
一个或多个汉字 ^[\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)?$

 

Java正则表达式使用

java.util.regex 包实现正则表达式主要包括以下三个类:

Pattern 类

pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

Matcher 类

Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

PatternSyntaxException

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

 

字符串的操作主要有四种:匹配、切割、替换、获取,我们接下来分别详解:

1.匹配

 String  matches()方法

1)用规则匹配整个字符串,用于判断是否符号规则。

public static void checkQQ(){
        String qq = "123B45668";

        String regex = "[1-9]\\d{4,14}";

        boolean flag = qq.matches(regex);
        if(flag)
            System.out.println(qq+"...is ok");
        else
            System.out.println(qq+"... 不合法");
         
}

2)匹配手机号码

/*
* 匹配手机号段只有 15xxx 16xxxx 开头的
*/
    public static void checkPhone()
    {
        String tel = "16900001111";
        String telReg = "1[56]\\d{9}";
        System.out.println(tel.matches(telReg));
    }

 

2.切割

String split()方法

根据给定正则表达式的匹配拆分此字符串,返回一个数组,代码示例如下:

String name = "mike   chen   jia   gou" ;
String regex =" +" ; //按照多个空格来进行切割
String[] strs = name.split(regex) ;  

 

3.替换

String replaceAll(regex,str)方法

使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

例如要将下面的重复字符替换为单个字符, 代码如下:

String name = "abctttttttcdemmmmmmfglllllll-------" ;
String regex ="(.)\\1+" ;
String result = name.replaceAll(regex, "$1");

结果为 :

abctcdemfgl-

 

4.获取

获取的方式,string对象里没有直接支持,因此要直接使用到Pattern和Matcher对象。

例如,要获取下面手机号码中间四位,代码示例如下:

String name = "13800138000" ;
String regex ="(\\d{3})(\\d{4})(\\d{4})" ;
Pattern pattern  = Pattern.compile(regex);
Matcher matcher = pattern.matcher(name);
String result = null;
if(matcher.find()) { //如果需要取所有,可以使用while
    //取第二组的数据。
    result = matcher.group(2);
}

 

 

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法