Skip to content

第二部分-正则表达式


正则表达式是由一些特定字符组成的模式,代表着一套识别字符串的规则。它就像一种特殊的"筛子",能够快速筛选出符合特定格式的文本。

Java 中提供了完整的正则支持,应用范围包括表单验证、爬虫数据提取、敏感信息脱敏等。

这些细节其实不用死记硬背,能看懂正则表达式、会查会用就够了。以前大家常用网页工具生成,现在有 AI 帮忙,写正则更轻松。

常用方法

String.matches() 判断字符串格式是否匹配

这是最简单直接的使用方式,适合判断一个字符串是否完全符合某种格式

java
String text = "13812345678";
boolean isPhone = text.matches("1[3-9]\\d{9}");

matches() 方法要求整个字符串完全匹配正则表达式,部分匹配是不算成功的。这一点和 Matcher.find() 不一样。

Pattern + Matcher 处理复杂匹配、提取、遍历

如果你需要在一段文本中提取多个匹配项,或者需要对匹配进行更细致的控制PatternMatcher 是更灵活的选择。

java
Pattern pattern = Pattern.compile("1[3-9]\\d{9}");
Matcher matcher = pattern.matcher("电话1:13812345678,电话2:15698765432");

while (matcher.find()) {
    System.out.println("找到手机号:" + matcher.group());
}
  • Pattern.compile(...):将正则表达式编译成模式对象,提高效率
  • matcher.find():每次查找下一个匹配位置
  • matcher.group():返回当前匹配到的内容

Pattern/Matcher 可以做很多高级操作,比如提取分组、获取匹配位置、控制查找起点等,是实战中最常用的方式。

方法作用
find()查找下一个匹配项(不全匹配也能命中)
group() / group(n)返回当前匹配的内容 / 指定分组内容
start() / end()返回当前匹配子串的起始/结束位置
matches()检查整个字符串是否完全匹配
replaceAll() / replaceFirst()替换所有 / 第一个匹配项

replaceAll() / replaceFirst() 正则替换

String 类自带的这些方法,可以结合正则表达式对文本进行替换操作。

java
String result = "我的电话是:13812345678,请联系我"
    .replaceAll("1[3-9]\\d{9}", "已隐藏");
// 输出:我的电话是:已隐藏,请联系我

你也可以使用分组引用来进行更复杂的替换:

java
String masked = "13812345678".replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
// 输出:138****5678

书写规则

字符类(匹配单个字符)

字符类用于匹配一组可能的字符中的一个:

表达式说明
[abc]只能是 a、b 或 c 其中一个字符
[^abc]除了 a、b、c 之外的任何字符
[a-zA-Z]任意一个英文字母(大小写均可)
[a-d[m-p]]a 到 d,或 m 到 p 的任意字符(并集)
[a-z&&[def]]a-z 和 def 的交集,即只能是 d、e 或 f
[a-z&&[^bc]]a 到 z 中除了 b 和 c(等同于[ad-z])
[a-z&&[^m-p]]a 到 z 中除了 m 到 p(等同于[a-lq-z])

预定义字符(便捷写法)

为了简化常用字符组合的书写,正则表达式提供了预定义字符:

表达式说明等价形式
.匹配任何一个字符
\d一个数字字符[0-9]
\D一个非数字字符[^0-9]
\s一个空白字符(空格、制表符等)
\S一个非空白字符[^\s]
\w一个单词字符[a-zA-Z_0-9]
\W一个非单词字符[^\w]

注意:在 Java 中使用正则表达式时,由于\在 Java 字符串中是转义字符,所以需要使用\\来表示正则表达式中的一个\。例如,表示数字的\d在 Java 字符串中要写成\\d

数量词(控制出现次数)

前面介绍的模式都只能匹配单个字符,要匹配多个字符,需要使用数量词:

表达式说明
X?X 出现一次或零次(可选项)
X*X 出现零次或多次(任意次数)
X+X 出现一次或多次(至少一次)
X{n}X 正好出现 n 次
X{n,}X 至少出现 n 次
X{n,m}X 至少出现 n 次,但不超过 m 次

其他常用符号

  • (?i) - 忽略大小写模式
  • | - 或运算符(选择匹配)
  • (...) - 分组(可以将多个字符作为一个单元)

正则表达式虽然看起来有些复杂,但掌握基本规则后,能极大提高文本处理的效率,是编程中不可或缺的工具。

评论