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面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》