深浅模式
正则表达式是由一些特定字符组成的模式,代表着一套识别字符串的规则。它就像一种特殊的"筛子",能够快速筛选出符合特定格式的文本。
Java 中提供了完整的正则支持,应用范围包括表单验证、爬虫数据提取、敏感信息脱敏等。
这些细节其实不用死记硬背,能看懂正则表达式、会查会用就够了。以前大家常用网页工具生成,现在有 AI 帮忙,写正则更轻松。
常用方法
String.matches()
判断字符串格式是否匹配
这是最简单直接的使用方式,适合判断一个字符串是否完全符合某种格式。
java
String text = "13812345678";
boolean isPhone = text.matches("1[3-9]\\d{9}");
matches()
方法要求整个字符串完全匹配正则表达式,部分匹配是不算成功的。这一点和Matcher.find()
不一样。
Pattern
+ Matcher
处理复杂匹配、提取、遍历
如果你需要在一段文本中提取多个匹配项,或者需要对匹配进行更细致的控制,Pattern
和 Matcher
是更灵活的选择。
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)
- 忽略大小写模式|
- 或运算符(选择匹配)(...)
- 分组(可以将多个字符作为一个单元)
正则表达式虽然看起来有些复杂,但掌握基本规则后,能极大提高文本处理的效率,是编程中不可或缺的工具。
评论