📓
Be a Javaer
  • Introduction
  • 第 1 章 Java编程开发入门
    • 第 1 节 Java开发准备
    • 第 2 节 Java基本概念
    • 第 3 节 Java数据类型划分
    • 第 4 节 Java运算符
    • 第 5 节 Java程序逻辑控制
    • 第 6 节 Java方法的定义及使用
  • 第 2 章 Java面向对象编程
    • 第 1 节 类与对象
    • 第 2 节 深入分析类与对象
    • 第 3 节 数组的定义与使用
    • 第 4 节 String类的基本概念
    • 第 5 节 String类的常用方法
    • 第 6 节 this关键字
    • 第 7 节 引用传递
    • 第 8 节 数据表与简单Java类映射
    • 第 9 节 对象比较
    • 第 10 节 static关键字
    • 第 11 节 代码块
    • 第 12 节 内部类
    • 第 13 节 链表的定义与使用
    • 第 14 节 继承性
    • 第 15 节 覆写
    • 第 16 节 数组操作
    • 第 17 节 辅助概念
      • final关键字
      • 多态性
    • 第 18 节 抽象类的定义及使用
    • 第 19 节 接口的定义及使用
    • 第 20 节 Object类
    • 第 21 节 拓展概念
      • 匿名内部类
      • 包装类
    • 第 22 节 包的定义及使用
    • 第 23 节 访问控制权限
      • 单例设计模式
      • 多例设计模式
    • 第 24 节 异常的捕获及处理
    • 第 25 节 Java5新特性
      • 可变参数
      • foreach循环
      • 静态导入
    • 第 26 节 泛型
    • 第 27 节 枚举
    • 第 28 节 Annotation
    • 第 29 节 Java7新特性
      • AutoCloseable
      • Try-with-resources
    • 第 30 节 Java8新特性
      • 接口定义增强
      • Lambda表达式
      • 方法引用
      • 函数式接口
  • 第 3 章 Java高级编程
    • 第 1 节 Java多线程基础实现
    • 第 2 节 线程常用操作方法
    • 第 3 节 线程的同步与死锁
    • 第 4 节 生产者与消费者
    • 第 5 节 Java基础类库
      • StringBuffer
      • Runtime
      • System
      • finalize
      • Cleaner
      • 对象克隆
    • 第 6 节 数字操作类
      • Math类
      • Random类
      • 大数字操作类
    • 第 7 节 日期处理类
      • Date类
      • 日期格式化
      • Calendar类
    • 第 8 节 比较器
    • 第 9 节 正则表达式
      • 常用的正则标记
      • String类对正则的支持
      • java.util.regex包支持
    • 第 10 节 反射机制
    • 第 11 节 动态代理
    • 第 12 节 反射与Annotation
    • 第 13 节 国际化程序实现
    • 第 14 节 开发支持类库
      • Arrays类
      • UUID类
      • Optional类
      • ThreadLocal类
      • 定时器
      • Base64加密工具
    • 第 15 节 文件操作
    • 第 16 节 字节流与字符流
    • 第 17 节 IO辅助概念
      • 字符编码
      • 内存流
      • 管道流
      • RandomAccessFile
    • 第 18 节 打印流
    • 第 19 节 System类对IO的支持
    • 第 20 节 对象序列化
    • 第 21 节 IO高级应用
      • 缓冲输入流
      • Scanner
    • 第 22 节 网络编程
    • 第 23 节 类集框架
    • 第 24 节 List集合
    • 第 25 节 集合输出
    • 第 26 节 Map集合
    • 第 27 节 Set集合
    • 第 28 节 集合工具类
      • Stack
      • Queue
      • Properties
      • Collections工具类
    • 第 29 节 数据流Stream
    • 第 30 节 JDBC简介
    • 第 31 节 Statement接口
    • 第 32 节 PreparedStatment接口
    • 第 33 节 批处理与事务处理
  • 第 4 章 Oracle数据库基础
    • 第 1 节 Oracle简介
    • 第 2 节 Oracle安装与配置
    • 第 3 节 SQLPlus命令
    • 第 4 节 SQL简介与数据表分析
    • 第 5 节 SQL简单查询
    • 第 6 节 SQL限定查询
    • 第 7 节 查询排序
    • 第 8 节 综合练习:基础查询
    • 第 9 节 单行函数
    • 第 10 节 多表查询
    • 第 11 节 分组统计查询
    • 第 12 节 子查询
    • 第 13 节 综合案例:复杂查询
    • 第 14 节 数据更新操作
    • 第 15 节 事务处理
    • 第 16 节 数据伪列
    • 第 17 节 数据表的创建与管理
    • 第 18 节 约束的创建与管理
    • 第 19 节 综合案例:数据表操作
    • 第 20 节 序列的定义与使用
  • 第 5 章 JavaWeb基础
  • 第 6 章 走向单体地狱
  • 第 7 章 GitFlow工作流指南
    • 版本控制
    • Git
    • 集中式工作流
    • 功能分支工作流
    • GitFlow 工作流
    • Forking 工作流
    • Pull Requests
  • 第 8 章 微服务入门
    • 第 1 节 微服务简介
    • 第 2 节 Linux
    • 第 3 节 Docker
    • Docker 仓库
    • Ubuntu 安装 Docker
    • Docker 镜像加速器
    • 第 4 节 Docker Compose
    • 第 5 节 GitLab
    • 第 6 节 Nexus
    • 第 7 节 Harbor
  • 第 9 章 再谈微服务
  • 第 10 章 Spring Boot
  • 第 11 章 Spring Cloud Netflix
  • 第 12 章 Apache Dubbo Zookeeper
  • 第 13 章 Spring Cloud Alibaba
  • 第 14 章 Vue
  • 第 15 章 Kubernetes
  • 第 16 章 Spring Security oAuth2
  • 第 17 章 Flutter
  • Redis
    • Redis 入门
    • Redis 的数据类型
    • Redis 事务
    • Jedis
    • Spring Boot 整合 Redis
    • Redis 配置文件
    • Redis 持久化
    • Redis 发布/订阅
    • Redis 主从复制
    • Redis Sentinel
    • Redis 缓存故障
  • Glossary
由 GitBook 提供支持
在本页
  • 问题引出
  • 常用的正则标记
  • String类对正则的支持
  • java.util.regex包支持
  • 总结

这有帮助吗?

  1. 第 3 章 Java高级编程

第 9 节 正则表达式

上一页第 8 节 比较器下一页第 10 节 反射机制

最后更新于5年前

这有帮助吗?

问题引出

下面要求编写一个程序:判断一个字符串是否由数字所组成。

实现原理:

  • 将字符串变为字符数组;

  • 而后判断每一个字符是否在'0'~'9'的范围之间。

范例: 实现字符串的判断

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "1234a56879";
		System.out.println(isNumber(str));
	}
	public static boolean isNumber(String temp) {
		char[] data = temp.toCharArray(); // 将字符串变为字符数,目的是循环取出
		for (int i = 0; i < data.length; i ++) {
			if (data[i] > '9' || data[i] < '0') {
				return false;
			}
		}
		return true;
	}
}

此时判断字符串是否由数字所组成,是一个很容易的实现的功能,但是这样一个简短的操作,却写出了这么多代码,如果说需要更加复杂的判断,这种方式显然就不再适用了。

范例: 更简单的做法

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "123456879";
		System.out.println(str.matches("\\d+"));
	}
}

对于之前的判断这里只用了一个字符串就实现了,而其中的"\\d+"就是正则表达式。

正则是从JDK1.4的时候正式引入到Java中的工具类,所有正则支持类都定义在java.util.regex包里面。在JDK1.4之前,如果想要使用正则,则需要单独下载一个正则表达式的开发包后才可以使用。

在java.util.regex包里面定义了两个主要的类:

  • Pattern类:此类对象如果要想取得必须使用compile()方法,方法的功能是编译正则;

  • Matcher类:通过Pattern类取得。

常用的正则标记

所有的正则可以使用的标记都在java.util.Pattern类里面定义。

1、单个字符

  • x :表示由任意一位字符所组成;

  • \\:表示转义字符"\";

  • \t:表示制表符;

  • \n:表示换行符;

2、字符集

  • [abc]:表示字符abc中任意一个;

  • [^abc]:表示不是字符abc中任意一个;

  • [a-z]:表示任意一位小写字母;

  • [a-zA-Z]:表示任意一位字母;

  • [0-9]:表示任意的一位数字;

3、简化的字符集

  • . :表示任意一位字符;

  • \d:表示[0-9];

  • \D:表示[^0-9];

  • \s:表示任意的空白字符,"\t"、"\n";

  • \S:表示任意非空白字符;

  • \w:等价于[a-zA-Z_0-9],表示由任意的字母、数字、_所组成;

  • \W:等价于[^a-zA-Z_0-9],表示不是由任意的字母、数字、_所组成;

4、边界匹配

  • ^ :正则的开始;

  • $ :正则的结束;

5、数量表达

  • X?:表示此正则可以出现0次或1次;

  • X+:表示此正则可以出现1次或1次以上;

  • X*:表示此正则可以出现0次1次或多次;

  • X{n}:表示此正则出现n次;

  • X{n,}:表示此正则至少出现n次;

  • X{n, m}:表示此正则出现(包含)n到m次;

6、逻辑运算

  • XY:正则X判断后再判断正则Y;

  • X|Y:满足正则X或正则Y;

  • (X):将多个正则设置为一组;

String类对正则的支持

在JDK1.4之后,由于正则的引入,所以String类里面也相应的增加了新的操作方法支持。

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)

普通

部分拆分

给出的几个方法里面对于替换和拆分实际上难度不高,最关键的就是正则匹配,在验证上使用的特别多。

范例: 实现字符串替换

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "asdJHGJhbvK()*&809^9865&^TDiuSY*&tybdYvkHGuvLv";
		String regex = "[^a-z]"; // 此处编写正则
		System.out.println(str.replaceAll(regex, ""));
	}
}

范例: 字符串拆分

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "as15dJH453GJhbv43KTDiuSY3tyb43YvkHGu98vLv";
		String regex = "\\d+";
		String[] result = str.split(regex);
		for (String s : result) {
			System.out.println(s);
		}
	}
}

范例: 验证一个字符串是否是数字,如果是则将其变为double型

  • 数字可能是整数,也可能是小数;

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "10.1";
		String regex = "\\d+(\\.\\d+)?";
		System.out.println(str.matches(regex));
		if (str.matches(regex)) {
			System.out.println(Double.parseDouble(str));
		}
	}
}

范例: 判断给定的字符串是否是一个IP地址(IPv4)

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "192.168.1.1";
		String regex = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
//		String regex = "(\\d{1,3}\\.){3}\\d{1,3}";
		System.out.println(str.matches(regex));
	}
}

范例: 给定一个字符串,要求判断其是否是日期格式,如果是则将其转换为Date型数据

package com.alpha;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "2009-12-25";
		String regex = "\\d{4}-\\d{2}-\\d{2}";
		System.out.println(str.matches(regex));
		if (str.matches(regex)) {
			Date date = new SimpleDateFormat("yyyy-MM-dd").parse(str);
			System.out.println(date);
		}
	}
}

范例: 判断电话号码

  • 格式一:12345678,"\\d{7,8}";

  • 格式二:029-12345678,"(\\d{3,4}-)?\\d{7,8}";

  • 格式三:(029)-12345678,"((\\d{3,4}-)|(\\(\\d{3,4}\\)-))?\\d{7,8}"。

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "(029)-12345678";
		String regex = "((\\d{3,4}-)|(\\(\\d{3,4}\\)-))?\\d{7,8}";
		System.out.println(str.matches(regex));
	}
}

范例: 验证email地址

  • 要求格式一:email由字幕、数字、_所组成。

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "hello_nihao123@git.com";
		String regex = "\\w+@\\w+\\.\\w+";
		System.out.println(str.matches(regex));
	}
}
  • 要求格式二:用户名要求由字母、数字、_、.组成,其中必须以字母开头,以字母或数字结尾,长度不超过30,最后的根域名只能够是.com、.cn、.net、.com.cn、.edu、.gov、.org。

package com.alpha;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "hello_ni.hao123@git.com";
		String regex = "[a-zA-Z][a-zA-Z0-9_\\.]{0,28}[a-zA-Z0-9]@\\w+\\.(net|cn|com|com\\.cn|net|edu|org|gov)";
		System.out.println(str.matches(regex));
	}
}

java.util.regex包支持

在大多数情况下使用正则的时候都会采用String类完成,但是正则最原始的开发包是java.util.regex,这个包里提供有两个类。

范例: Pattern类

package com.alpha;
import java.util.Arrays;
import java.util.regex.Pattern;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "a1b22c333d4444e55555f";
		String regex = "\\d+";
		Pattern pattern = Pattern.compile(regex); // 编译正则
		String[] result = pattern.split(str); // 拆分字符串
		System.out.println(Arrays.toString(result));
	}
}

范例: 字符串验证

package com.alpha;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		String str = "32323";
		String regex = "\\d+";
		Pattern pattern = Pattern.compile(regex); // 编译正则
		Matcher mat = pattern.matcher(str); // 进行正则匹配
		System.out.println(mat.matches()); // 匹配结果
	}
}

正是因为String类本身就已经支持这样两种操作了,所以很少再去利用这两个类进行操作。

总结

  1. 利用正则实现验证代码可以最少化;

  2. 一定要清楚String类对正则支持的几个方法,以及所有讲解过的相关程序。

常用的正则标记
String类对正则的支持
java.util.regex包支持