WMX · 随记
·Java· 3 分钟阅读

正则表达式里的用户输入,要当数据处理

用户输入一个点号,本想精确搜索点号,却匹配了任意字符。把外部文本直接拼进正则,会改变匹配规则。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Full Course

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

用户输入一个点号,本想精确搜索点号,却匹配了任意字符。把外部文本直接拼进正则,会改变匹配规则。

理解核心机制

Pattern.quote 把一段文本按字面量参与匹配。替换字符串属于另一套语法,包含美元符号和反斜杠时,应考虑 Matcher.quoteReplacement,二者不能混为一谈。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java10 行 · 可横向滚动
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Demo {
    public static void main(String[] args) {
        String input = "a.b aXb";
        Pattern exact = Pattern.compile(Pattern.quote("a.b"));
        System.out.println(exact.matcher(input)
            .replaceAll(Matcher.quoteReplacement("$literal")));
    }
}

适用边界与常见误区

对用户提供的完整正则,仅做 quote 会改变其功能;如果产品允许用户写正则,还要控制复杂度和资源消耗。简单字面量替换可直接使用 String.replace。

继续练习

用点号、方括号、美元符号和反斜杠分别作为搜索与替换内容,检查哪些字符在两种语法中有特殊意义。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档