正则表达式

正则表达式(Regular Expression ,在代码中常简写成regex、regexp或RE)是从jdk1.4引入到java中的。

正则标记

所有正则表达式支持的类都定义在java.util.regex包里。

主要由两个类:

  • Pattern类:主要定义要使用的表达式对象。
  • Matcher类:用于进行正则标记与指定内容的匹配操作。

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

  • 单个字符(数量:1)
  • 字符:表示由一位字符组成;
  • \ \ : 表示准仪字符"\";
  • “\t” : 表示一个"\t"符号;
  • “\n” : 匹配换行(\n)符号;
  • 字符集(数量:1)
  • [ abc ] : 表示可能是字符 a 、字符 b 、字符 c中的任意一位;
  • [ ^abc ] : 表示不是字符 a 、b 、c中的任意一位;
  • [ a-z ] : 表示所有的小写字母;
  • [ a-zA-Z ] : 表示任意一位字母,不区分大小写;
  • [ 0-9 ] : 表示任意的一位数字;
  • 简化的字符集表达式(数量:1)
  • . : 表示任意一位字符;
  • \d : 等价于 “[ 0-9 ]”;
  • \D : 等价于 “[ ^0-9 ]”;
  • \s : 表示任意的空白字符,例如:"\t","\n";
  • \S : 表示任意的非空白字符;
  • \w : 等价于"[ a-zA-Z_0-9 ]",表示由任意的字母、数字、_ (下划线)组成;
  • \W : 等价于"[ ^ a-zA-Z_0-9 ]",表示不是由任意的字母、数字、_ (下划线)组成;
  • 边界匹配:
  • ^ : 正则的开始;
  • $ : 正则的结束;
  • 数量表达:
  • 正则? : 表示此正则可以出现 0 次或1次;
  • 正则+ : 表示此正则可以出现1次或1次以上;
  • 正则* : 表示可以出现0次、1次或者多次;
  • 正则{n} : 表示侧正则正好出现 n 次;
  • 正则{n, } : 表示侧正则出现 n 次以上;
  • 正则{ n,m } : 表示侧正则出现 n~m次;
  • 逻辑运算:
  • 正则1 正则2 :正则1 判断完成后继续判断正则2;
  • 正则1 | 正则2:正则1 或者正则2 有一组满足即可;
  • ( 正则 ) :将多个正则作为一组,可以为这一组单独设置出现的次数;

String 类对正则的支持

虽然 Java 本身提供的正则支持类都在 java.util.regex 包中,但是从实际的使用来讲,只有很少情况才会利用这个包中的Pattern 或 Matcher 类操作正则,大部分情况下都会考虑使用 java.lang.String类中提供的方法来直接简化正则的操作。

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

方法名

描述

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 TestDemo {
    public static void main(String[] args) {
        String string = "hello^#&*^%#@(*7659word6546545723415*-/-+9";
        String regex = "[^a-z]";
        String replaceAll = string.replaceAll(regex, "");
        System.out.println(replaceAll);
    }
}

执行结果:

helloword

字符串的拆分:

public class TestDemo {
    public static void main(String[] args) {
        String string = "hello1354341354world13554!";
        String regex = "\\d+"; 
        String[] split = string.split(regex);
        for (String s : split) {
            System.out.println(s);
        }
    }
}

执行结果:

hello
world
!

为什么使用 “\\d”?

因为要将""转义。

扩展:小数的验证

public class TestDemo {
    public static void main(String[] args) {
        String string = "10.10";
        String regex = "\\d+(\\.\\d+)?";
        if (string.matches(regex)){
            double parseDouble = Double.parseDouble(string);
            System.out.println(parseDouble);
        }
    }
}

执行结果:

10.1

分析:因为 "."可以表示任意字符,所以需要转义成普通的小数点。

IP的验证:

public class TestDemo {
    public static void main(String[] args) {
        String string = "192.168.1.1";
        String regex = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
        if (string.matches(regex)){
            System.out.println(string);
        }
    }
}

执行结果:

192.168.1.1

日期的验证:

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

public class TestDemo {
    public static void main(String[] args) throws ParseException {
        String string = "2018-12-18";
        String regex = "\\d{4}-\\d{1,2}-\\d{1,2}";
        if (string.matches(regex)){
            Date date = new SimpleDateFormat("yyyy-MM-dd").parse(string);
            System.out.println(date);
        }
    }
}

Email的验证:

public class TestDemo {
    public static void main(String[] args) {
        String string = "wangyiyouxiang@163.com";
        String regex = "\\w+@\\w+\\.\\w+";
        if (string.matches(regex)){
            System.out.println(string);
        }
    }
}

更严格一点:

public class TestDemo {
    public static void main(String[] args) {
        String string = "wangyiyouxiang@163.com";
        String regex = "\\w+@\\w+\\.(com|net|cn|com\\.cn|net\\.cn|org|gov|edu)";
        if (string.matches(regex)){
            System.out.println(string);
        }
    }
}

Pattern和Matcher

Pattern类的常用方法:

方法

描述

public static Pattern complie(String regex)

编译正则表达式

public String[] split(CharSequence input)

数据全拆分操作

public String[] split(CharSequence input,int limit)

数据的部分拆分

public Matcher matcher(CharSequence input)

取得Matcher类对象

例如:

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

public class PatternDemo {
    public static void main(String[] args) {
        String string = "hello^#&*^%#@(*7659word6546545723415*-/-+9";
        String regex = "[^a-z]+";
        Pattern compile = Pattern.compile(regex);
        String[] split = compile.split(string);
        System.out.println(Arrays.toString(split));
    }
}

执行结果:

[hello, word]

Matcher类的常用方法:

方法

描述

public boolean matches()

正则匹配

public String replaceAll(String replacement)

全部替换

public String replaceFirst(String replacement)

替换首个

例如:

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

public class MatcherDemo {
    public static void main(String[] args) {
        String string = "100";
        String regex = "\\d+";
        Pattern compile = Pattern.compile(regex);
        Matcher matcher = compile.matcher(string);
        boolean matches = matcher.matches();
        System.out.println(matches);
    }
}

执行结果:

true