Java学习总结:38(正则表达式)

正则表达式

正则表达式本质上是一种字符串操作语法规则,利用它我们能更加灵活地实现字符串的匹配、拆分、替换等操作。

正则标记

所有的正则表达式支持的类都定义在java.util.regex包里面。这个包里面定义了如下两个主要的类:
1.Pattern类:主要定义要使用的表达式对象
2.Matcher类:用于进行正则标记与指定内容的匹配操作。

所有可以使用的正则标记都在java.util.regex.Pattern类说明文档中定义,常用的标记有如下6类:

1.单个字符(数量:1)

  • 字符:表示由一位字符组成;
  • \\\:表示转义字符“\”;
  • \t:表示一个“\t”符号;
  • \n:表示一个“\n”符号;

2.字符集(数量:1)

  • [abc]:表示可能是字符a、字符b、字符c中的任意一位;
  • [^abc]:表示不是字符a,b、c中的任意一位;
  • [a-z]:所有的小写字母;
  • [a-zA-Z]:表示任意的一位字母,不区分大小写;
  • [0-9]:表示任意的一位数字;

3.简化的字符集表达式(数量:1)

  • .:表示任意的一位字符;
  • \d:等价于“[0-9]”,属于简化写法;
  • \D:等价于“[^0-9]”,属于简化写法;
  • \s:表示任意的空白字符,例如:“\t”、“\n”;
  • \S:表示任意的非空白字符;
  • \w:等价于“[a-zA-Z_0-9]”,表示由任意的字母、数字、_组成;
  • \W:等价于“[a-zA-Z_0-9]”,表示不是由任意的字母、数字、_组成;

4.边界分配

  • ^:正则的开始;
  • $:正则的结束;

5.数量表达

  • 正则?:表示此正则可以出现0次或1次;
  • 正则+:表示此正则可以出现1次或1次以上;
  • 正则*:表示此正则可以出现0次、1次或多次;
  • 正则{n}:表示此正则正好出现n次;
  • 正则{n,}:表示此正则出现n次以上(包含n次);
  • 正则{n,m}:表示此正则出现n~m次;

6.逻辑运算

  • 正则1正则2:正则1判断完成后继续判断正则2;
  • 正则1|正则2:正则1或是正则2有一组满足即可;
  • (正则):将多个正则作为一组,可以为这一组单独设置出现的次数。

Pattern类常用方法

No. 方法名称 类型 描述
1 public static Pattern compile(String regex) 普通 编译正则表达式
2 public String[] split(CharSequence input) 普通 数据全拆分操作
3 public String[] split(CharSequence input,int limit) 普通 数据部分拆分操作
4 public Matcher matcher(CharSequence input) 普通 取得Matcher类对象

注意:Pattern类没有定义构造方法,所以想要取得Pattern类对象,必须利用compile()方法进行正则表达式的编译操作。同时,因为在Pattern类中定义的方法,在进行参数接收时接收的都是CharSequence接口对象,所以只要是CharSequence接口的子类都可以进行正则操作。

例:利用Pattern类实现字符串拆分

package Project.Study.PatternClass;

import java.util.Arrays;
import java.util.regex.Pattern;

public class Test1 {
    public static void main(String[]args){
        String str="hello3232world32!!!";
        String regex="\\d+";
        Pattern pattern=Pattern.compile(regex);		//编译正则
        String[] result =pattern.split(str);		//拆分字符串
        System.out.println(Arrays.toString(result));
    }
}
//结果:
//[hello, world, !!!]

Matcher类常用方法

No. 方法名称 类型 描述
1 public boolean matches() 普通 正则匹配
2 public String replaceAll(String replacement) 普通 全部替换
3 public String replaceFirst(String replacement) 普通 替换首个

例:实现字符串验证操作

package Project.Study.MatcherClass;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test1 {
    public static void main(String[]args){
        String str="100";
        String regex="\\d+";
        Pattern pattern=Pattern.compile(regex);	//编译正则
        Matcher matcher=pattern.matcher(str);	//进行正则匹配
        System.out.println(matcher.matches());	//匹配结果
    }
}
//结果:
//true

String类对正则的支持

事实上,在实际开发中String类使用得较多,大部分情况下都会使用String类中提供的方法来直接简化正则操作,只有很少的情况下才会使用Pattern类和Matcher类操作正则。

String类与正则有关的5个操作方法

No. 方法名称 类型 描述
1 public boolean matches(String regex) 普通 正则验证,使用指定的字符串判断其是否符合给出的正则表达式结构
2 public String replaceAll(String regex,String replacement) 普通 将满足正则标记的内容全部替换为新的内容
3 public String replaceFirst(String regex,String replacement) 普通 将满足正则标记的首个内容替换为新的内容
4 public String[] split(String regex) 普通 按照指定的正则标记进行字符串的全拆分
5 public String[] split(String regex,int limit) 普通 按照指定的正则标记进行字符串的部分拆分

上面5个方法包括字符串的替换、拆分、验证操作,下面我们就来实现一下

例:实现字符串的替换

package Project.Study.Regex;

public class Test1 {
    public static void main(String[]args){
        String str="hel12l32o232121wQo@#rl32d!!!";//给出一组混乱的字符串
        String regex="[^a-z]";		//编写正则,剔除所有不是小写字母的字符
        System.out.println(str.replaceAll(regex,""));//字符串替换
    }
}
//结果:
//helloworld

例:字符串的拆分

package Project.Study.Regex;

public class Test2 {
    public static void main(String[]args){
        String str="hello090world3241!!!";
        String regex="\\d+";	//表示"[0-9]"一位以上的整数位,属于简化写法,因为是在字符串中定义的,所以用"\\"代替"\",属于转义字符操作
        String[] result =str.split(regex);
        for (String s : result) {
            System.out.println(s);	//输出分隔好的字符串
        }
    }
}
//结果:
//hello
//world
//!!!

正则验证的应用

若是字符串是带小数点".“的数字呢(小数点”."在正则中表示任意字符),我们又应该怎么将其转换为浮点型数据?
例:将字符型数字转换为浮点型数据

package Project.Study.Regex;

public class Test3 {
    public static void main(String[]args){
        String str1="10.01";
        String str2="10.10";
        String regex="\\d+(\\.\\d+)?";
        if(str1.matches(regex)){		//转型前要进行验证
            System.out.println(Double.parseDouble(str1));
        }
        if(str2.matches(regex)){		//转型前要进行验证
            System.out.println(Double.parseDouble(str2));
        }
    }
}
//结果:
//10.01
//10.1

上程序中的正则解析:
在这里插入图片描述
上程序中的"?"表示该小数位可能出现0次或1次。
上程序中使用了matches()方法进行正则验证,同理,我们也可以用它来判断其他,例如:IP地址

例:

package Project.Study.Regex;

public class Test4 {
    public static void main(String[]args){
        String str1="192.168.1.1";
        String str2="192.1683.1.1";
        String regex1="\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";//该正则中的"\\d{1,3}"表示1~3位数字
        String regex2="(\\d{1,3}\\.){3}\\d{1,3}";		//简化正则操作
        System.out.println(str1.matches(regex1));
        System.out.println(str1.matches(regex2));
        System.out.println(str2.matches(regex1));
        System.out.println(str2.matches(regex2));
    }
}

//结果:
//true
//true
//false
//false

例:判断日期格式是否正确

package Project.Study.Regex;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test5 {
    public static void main(String[]args) throws ParseException {
        String str="2013-8-15";
        String regex="\\d{4}-\\d{1,2}-\\d{1,2}";	//定义验证正则
        if(str.matches(regex)){						//符合规则
            Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);
            System.out.println(date);
        }
    }
}
//结果:
//Thu Aug 15 00:00:00 CST 2013
发布了49 篇原创文章 · 获赞 25 · 访问量 1505

猜你喜欢

转载自blog.csdn.net/weixin_45784666/article/details/105348847
今日推荐