一、正则表达式简介
正则表达式属于字符串功能加强,基本上所有的项目开发里面都会有正则表达式的身影。正则在很多底层的设计里面也会被大量采用。
( Regular Expressions )最早是在Linux系统上被广泛使用的一-种字符串标准,在JDK1.4的时候才正式被Java所引用,正则表达式的出现是为了解决字符串在进行替换、拆分、匹配等方面的功能而设计出来的。
例:判断字符串是否由数字所组成
- 传统做法:将字符串拆分为字符数组,然后进行单个字符的依次判断
下面通过正则表达式实现:
public class January_eight {
public static void main(String[] args) {
String str = new Scanner(System.in).nextLine();
if(str.matches("\\d+")){ //进行正则匹配
System.out.println("字符串由数字组成");
}else {
System.out.println("字符串中含有非数字字符");
}
}
}
JIDK 1.4之后引入了正则表达式的概念之后,由于正则主要使用在字符串的结构处理上,所以对String类也做出了许多的改变,在当前程序中所见到的“\d+”符号就属于正则表达式的定义。
二、常用正则标记(背下来)
如果要使用正则表达式,就要使用大量的正则匹配标记,所有的正则匹配标记都在java.util.regexPattern类中定义了,下面列出常用正则匹配标记。
- 字符(未加入任何量词,表示一位):
- x: 表示由一个字母“x”所组成;
- \: 匹配一个"" ;
- \t: 匹配转义字符"\t";
- \n: 匹配转义字符“\n”;
- 字符范围(未加入任何量词,表示一位):
- 简化表达式(未加入任何量词,表示一位):
注意使用简化的正则需要加两个\ 例: “6”.matches("\d"); //true
- “.”: 任意字符;
- \d: 匹配任意一位数字,等价于"0-9";
- \D: 匹配任意一位非数字,等价于"[∧0-9]";
- \s: 匹配任意的一位空字符; (空字符 \t \r \n \f 都算)
- \S: 匹配任意的一位非空字符; (空字符 \t \r \n \f 都算)
- \w: 匹配任意的一位字母,等价于“a-zA-Z”;
String regex = "\\w"; // 写一个\ 代表转义 - \W: 匹配任意的一位非字母,等价于“[∧a-zA-Z]”;
- 边界匹配:
- ∧: 匹配开始位置;
- $: 匹配结束位置;
- 数量描述:如果未加数量描述的定义,则整体在进行处理的时候只能够匹配一次。
- 正则表达式?: 表示该正则出现0次或1次;
- 正则表达式*: 表示该正则出现0次、1次或多次;
- 正则表达式+:表示该正则出现1次或多次;
- 正则表达式{n}:表示该正则正好出现n次;
- 正则表达式{n,}:表示该正则出现n次以上;
- 正则表达式{n,m}:表示正则出现n~m次。
- 逻辑运算:
- 正则表达式A正则表达式B:表示在A正则之后紧跟着验证B正则;
- 正则表达式A|正则表达式B:两个正则二选一;
- (X):将多个正则定义为一组进行控制。
三、String类对正则的支持
JDK1.4之后为了方便开发者进行正则的处理,所以对String类做出了大量的改进,里面提供了支持有如下的操作正则的方法:
public boolean matches(String regex)
进行正则的匹配验证
public String replaceAll(String regex,String replacement)
替换全部与正则匹配的内容
public String replaceFirst(String regex,String replacement)
替换首个与正则匹配的内容
public String[] split(String regex)
依据正则全部拆分成一个字符串数组
public String[] split(String regex,int limit)
依据正则部分拆分成一个字符串数组
例:实现替换操作
public class Demo_01 {
public static void main(String[] args) {
String a="alksdkas \']lw [pke ][oe =[12ek123[ork1[3o kpsajdpjsjdipasjp389u3 r3jr8 3j";
String regex="[^a-zA-Z]"; //所有的非字母
System.out.println(a.replaceAll(regex,"")); //将所有非字母替换为“” 空字符
}
}
例:实现正则拆分
public class Demo_01 {
public static void main(String[] args) {
String a="aaa111bbb222ccc333ddd5fff55ggg8hhh";
String regex="\\d+"; //匹配多位数字
System.out.println(Arrays.toString(a.split(regex)));
}
}
程序执行结果:[aaa, bbb, ccc, ddd, fff, ggg, hhh]
在进行正则处理的时候,字符串中最重要的就是匹配结构。
例:判断小数结构后转型
public class Demo_01 {
public static void main(String[] args) {
String a = "123456.123";
String regex = "\\d+(\\.\\d+)?"; //小数位出现一次或0次
if (a.matches(regex)) {
System.out.println(Double.parseDouble(a));
} else {
System.out.println("字符串格式不正确");
}
}
}
程序执行结果:123456.123
例:实现日期的判断处理
import java.util.Date;
import java.text.SimpleDateFormat;
public class Demo_01 {
public static void main(String[] args) throws Exception{
String a = "2020-02-20";
String regex = "\\d{4}-\\d{2}-\\d{2}";
if (a.matches(regex)) {
Date date= new SimpleDateFormat("yyyy-MM-dd").parse(a);
System.out.println(date);
} else {
System.out.println("字符串格式不正确");
}
}
}
程序执行结果:Thu Feb 20 00:00:00 GMT+08:00 2020
在以后所编写的代码里面,所有的数据转型操作一定要通过正则验证之后才可以进行后续的转换处理,另外要清楚正则本身的支持很到位,可以判断各种复杂的字符串组成结构。
例: 判断email组成
- 要求email组成格式:用户名可以由字母、数字、“-”、“”组成,且只能使用字母开头,域名只能够使用字母,数字,“",“-”组成,后缀必须是“.com”, “.cn”, “.com.cn”, “.net”, “.org”, “.gov”。
public class Demo_01 {
public static void main(String[] args) throws Exception{
String a = "kinggm123456@qq.com";
String regex = "[a-zA-Z][a-zA-Z0-9_\\-]+@[a-zA-Z0-9_\\-]+\\.(com|cn|com\\.cn|net|org|gov)";
System.out.println(a.matches(regex));
}
}
程序执行结果:true
先分析正则结构再编写匹配
java.util.regex包支持
从jdk1.4开始Java追加了“java.util.regex”开发包,实现正则相关类的定义,实际上这个包里面只有两个核心的类
- Pattern:进行正则的编译和匹配对象的创建;
- Matcher:进行正则的匹配处理,以及分组操作;
例:使用Pattern类实现字符串的拆分
import java.util.Arrays;
import java.util.regex.Pattern;
public class Demo_01 {
public static void main(String[] args){
String a = "a11b22c33d55e";
String regex = "\\d+";
Pattern pattern = Pattern.compile(regex);//正则编译
System.out.println(Arrays.toString(pattern.split(a)));
}
}
程序执行结果:[a, b, c, d, e]
使用Pattern类最重要的一个目的是进行Matcher类的实例化处理,使用Matcher类可以实现正则的替换以及匹配处理。
例:正则匹配
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo_01 {
public static void main(String[] args){
String a = "123.123";
String regex = "\\d+(\\.\\d+)?";
Pattern pattern = Pattern.compile(regex); //正则编译
Matcher matcher = pattern.matcher(a); //正则匹配对象
System.out.println(matcher.matches());
}
}
程序执行结果:true
使用Matcher类还可以实现字符串内容的替换处理,只要与匹配有关的所有操作都在Matcher类中定义了。
例:【十分重要】观察分组处理
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo_01 {
public static void main(String[] args){
String sql = "INSERT INTO dept(deptno,dname,loc) VALUES (#{deptno},#{dname},#{loc})";
//取出"#{xxx}" 定义的所有内容
String regex = "#\\{\\w+\\}";
Pattern pattern = Pattern.compile(regex); //正则编译
Matcher matcher = pattern.matcher(sql); //正则匹配对象
while (matcher.find()){ //是否有后续匹配
String str = matcher.group(0);
System.out.println(str.replaceAll("#\\{|\\}",""));
}
}
}
程序执行结果:
deptno
dname
loc
正则是日后所有项目开发与设计的必备的核心功能,必须把以上全部代码掌握。
来源:CSDN
作者:M&Y
链接:https://blog.csdn.net/qq_37883866/article/details/103893652