正则表达式

导言

正则表达式在线生成工具:http://tools.jb51.net/regex/create_reg

正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,是一种可以用于模式匹配和替换的规范。一个正则表达式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串

String 类里就提供了如下几个特殊的方法:

  • boolean matches(String regex):判断字符是否匹配指定的正则表达式;
  • String replaceAll(String regex,String replcement):将该字符串所有匹配regex的子串替换为replacement
  • String[] split(String regex):以regex作为分隔符,将字符串分割为字符数组。

上面这些特殊的方法都依赖于 Java 提供的正则表达式支持,除此之外,Java 还提供了 Pattern 和 Matcher 两个类专门用于提供正则表达式支持。

正则表达式是一个非常神奇、高级的知识,其实正则表达式是一种非常简单而且非常实用的工具。正则表达式是一个用于匹配字符串的模板。实际上,任意字符串都可以当成正则表达式使用。

匹配单一字符

示例 说明
. 句点符号匹配任意单个字符,数字字母下划线空格符制表符等,如"C.T",可以匹配"CAT",“C&T”,“C0T” 等
* 匹配 0次或多次,如"c*t",可以匹配"ct",“ccct”,其中是字符"c"匹配0或多次
+ 匹配 1次或多次
匹配 0次或1次
{n} 恰好n次
{n,} 至少n次
{n,m} 从n到m次
$ 匹配一行的结尾
^ 匹配一行的开头
\ 转义字符,上面的这些字符如要表示本身,都需要转义字符表示,如".“表示为” \ . "

下面来看看[],{},()分别表示什么

示例 说明
{} 用于标记前面子表达式的出现频度
() ()括号用于将多个表达式组成一个子表达式,其中\1就表示前面一个括号内表达式的内容,如"(a* b)dd\1" 等价于 “(a* b)dd(a*b)”
[] 用于确定中括号表达式的开始和结束位置,下表详细介绍

[]的作用

示例 说明
枚举 如[abc],表示a,b,c其中任意一个字符
- - 表示范围 ,如[a-d],表示a~d 中的任意一个字符,[a-dx-z],表示a~d、 x~z的任意一个字符
^ ^ 表示求否,[^a-d] 表示非a~d范围内的任意单个字符,此^ 在[]里面不同于在开头,当^ 在开头表示匹配字符串的开头
&& &&表示与运算,例如 [a-z&&[def]]是 a~z 和 [def] 的交集,表示 d、e、f;[a-z&&^bc]]是 a~z 范围内的所有字符,除 b 和 c 之外
并运算与前面的枚举类似。例如[a-d[m-p]]表示 [a-dm-p]

注意:一个正则表达式中怎么有那么多反斜杠?这是由于 Java 字符串中反斜杠本身需要转义,因此两个反斜杠(\)实际上相当于一个(前一个用于转义)。

匹配多个字符

上面的正则表达式依然只能匹配单个字符,这是因为还未在正则表达式中使用**“通配符”,“通配符”是可以匹配多个**字符的特殊字符。正则表达式中的“通配符”远远超出了普通通配符的功能,它被称为预定义字符,正则表达式支持如下表 所示的预定义字符。

示例 说明
\d 匹配0~9的所有数字 单个
\D 匹配非数字
\s 匹配所有空格字符,包括空格、制表符、回车符、换行符、换页符
\S 匹配非空格字符
\w 匹配所有的单词,包括数字0-9,字母a-z和下划线_
\W 匹配非单词字符

其中

  • d是digit的意思,表示数字;
  • s是space的意思,表示空白;
  • w是word的意思,表示 单词;
  • D、S、W与小写匹配的字符相反。

总结一下:
正则表达式_第1张图片

正则表达式的应用–Java

java.util.regex 是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern 和 Matcher。

Pattern 对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为 Pattern 对象,然后再利用该 Pattern 对象创建对应的 Matcher 对象。执行匹配所涉及的状态保留在 Matcher 对象中,多个 Matcher 对象可共享同一个 Pattern 对象。

// 将一个字符串编译成 Pattern 对象
Pattern p = Pattern.compile("a*b");
// 使用 Pattern 对象创建 Matcher 对象
Matcher m = p.matcher("aaaaab");
boolean b = m.matches(); // 返回 true

或者直接通过matches函数进行匹配

String str = "aaaaaab" //原字符串
boolean b = str.matches("a*b"); //a*b即为regex

如下一些常用的正则表达式

public class Main {
    public static void main(String[] args) {
        String s1 = "15345678911";
        System.out.println(s1.matches("1[35]\\d{9}"));//匹配电话号码     
        String s2 = "[email protected]";
        System.out.println(s2.matches("\\w{3,20}@[a-zA-Z0-9]+\\.(com|cn|org|net|gov)"));//匹配邮箱
        String s3 = "32010219900210200X";
        System.out.println(s3.matches("\\d{17}[\\d|X]|\\d{15}"));//匹配身份证号码
        String s4 = "2020.10.8";
        System.out.println(s4.matches("\\d{4}(.|\\-|\\/)\\d{1,2}\\1\\d{1,2}"));//匹配日期 \\1 表示前面一个括号的内容  \\d{4}(\\-|\\/|.)\\d{1,2}\\1\\d{1,2}
        String s5 = "zzzb3";      
        System.out.println(s5.matches("zzz[a-z]3"));
    }
}

你可能感兴趣的:(Java)