正则表达式详解

108 阅读3分钟

正则表达式的概念

  • 正则表达式就是用来验证各种字符串的规则:它内部描述了一些规则,我们可以验证用户输入的字符串是否匹配这个规则
  • 常见例子:验证手机号格式,验证身份证号格式,验证邮箱格式。
  • 正则表达式的分类:字符类,逻辑运算符,预定义字符,数量词

下面我将通过正则表达式的各个分类来介绍正则表达式

字符类

  • [abc]:代表a或者b,或者c字符中的一个
System.out.println("a".matches("[abc]")); // true
  • [^abc]:代表除a,b,c以外的任何字符
System.out.println("a".matches("[^abc]")); // false
  • [a-z]:代表a-z的所有小写字符中的一个
System.out.println("z".matches("[a-zA-z]")); // true
  • [A-Z]:代表A-Z的所有大写字符中的一个
System.out.println("zz".matches("[a-zA-Z][a-zA-Z]")); //true
  • [0-9]:代表0-9之间的某一个数字字符
System.out.println("0".matches("[a-zA-Z]"));//false
  • [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符
System.out.println("0".matches("[a-zA-Z0-9]"));//true
  • [a-fo-z]:代表a-f或者o-z之间的任意一个字符
System.out.println("az".matches("[a-zA-Z]"));//false,两个字符无法和一个字符相匹配

逻辑运算符

  • &&:并且
  • | :或者
  • \ :转义字符

预定义字符

  • ".": 匹配任何字符
  • "\d": 任何数字[0-9]的简写
  • "\D":非任意数字[^0-9]的简写
  • "\s": 空白字符:[ \t\n\x0B\f\r] 的简写
  • "\S": 非空白字符:[^\s] 的简写
  • "\w":单词字符:[a-zA-Z_0-9]的简写
  • "\W":非单词字符的[^\w]的简写

数量词

  • X? : 0次或1次
  • X* : 0次或多次
  • X+ : 1次或多次
  • X{n} : 恰好n次
  • X{n,} : 至少n次
  • X{n,m} : n到m次(包含n和m)
public class Demo {
	public static void main(String[] args) {
		 // 必须是数字 字母 下划线 至少 6位
        System.out.println("2442fsfsf".matches("\\w{6,}"));//true
        System.out.println("244f".matches("\\w{6,}"));//false

        // 必须是数字和字符 必须是4位
        System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
        System.out.println("23 F".matches("[a-zA-Z0-9]{4}"));//false
        System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
        System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false
	}
}

了解完了正则表达式的规则之后可以做一些练习巩固一下,下面我将提供一些关于正则表达式的练习

练习

验证手机号码

  • 手机号码规则
    1. 手机号码只能以1开头
    2. 手机号码第二位只能是3-9之间的
    3. 后面9位可以任意数字
  • String regex1 = "1[3-9]\\d{9}";
  • System.out.println("13112345678".matches(regex1));//true

验证座机号码

  • 座机号码规则
    1. 一定是以0开头的
    2. 区号从第二位开始可以是任意的数字,可以出现2到3次。
    3. 区号和号码中间可以有 - 也可以没有
    4. 号码的第一位也不能以0开头,从第二位开始可以是任意的数字,号码的总长度:5-10位
  • String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
  • System.out.println("020-2324242".matches(regex2)); //true