如何用正则表达式精准提取数字、关键词与单字符(非贪婪匹配教程)

胖宇同学_1177

胖宇同学_1177

2026-04-28

658人浏览

原创

如何用正则表达式精准提取数字、关键词与单字符(非贪婪匹配教程)

本文介绍一种“匹配优先”而非“分割优先”的正则策略:通过交替模式(alternation)一次性捕获所有目标单元——包括浮点数、预设关键词(如 "cats" "dogs")及其余单字符,避免复杂循环与多轮拆分。

本文介绍一种“匹配优先”而非“分割优先”的正则策略:通过交替模式(alternation)一次性捕获所有目标单元——包括浮点数、预设关键词(如 "cats" "dogs")及其余单字符,避免复杂循环与多轮拆分。

在字符串处理中,面对“既要保留特定单词、又要识别数字、其余字符逐个切分”的需求,传统 String.split() 往往力不从心——因为 split 本质是基于分隔符的切割,而本例需要的是按语义单元进行提取。正确的思路是:不拆分,而是主动匹配所有合法片段。

核心正则模式为:

cats|dogs|d+(?:.d+)?|.

该模式采用 |(或)逻辑构成交替结构,各分支按从左到右顺序尝试匹配,且正则引擎默认启用最长匹配(greedy)与优先匹配(first-match-wins),因此需注意分支顺序:

  • cats|dogs:优先匹配完整关键词,防止被后续更短的模式截断(如 "cats" 不会先被匹配成 "c");
  • d+(?:.d+)?:匹配整数或浮点数(如 "3", "3.0", "8.0"),注意此处使用 + 而非 * 避免匹配空数字;若需支持 .5 这类前导小数点,可扩展为 d*.?d+;
  • .:作为兜底项,匹配任意单个字符(含符号、字母等未被前述规则覆盖的内容),确保无遗漏。

Java 实现示例如下:

Kino视界
Kino视界

一款AI视频创作工具,主要用于Kino视界-AI短剧漫剧专业视频制作工具,适合需要提升相关任务效率的用户。

下载
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Tokenizer {
    public static List<string> tokenize(String input, String... keywords) {
        // 动态构建关键词部分(转义正则元字符,如 dogs → dogs,但若含 . * + 等需处理)
        String keywordPattern = String.join("|", Arrays.stream(keywords)
                .map(Pattern::quote) // 安全转义,防止关键词含正则特殊字符
                .toArray(String[]::new));

        String numberPattern = "\d+(?:\.\d+)?";
        String fallbackPattern = ".";

        String regex = String.format("%s|%s|%s", keywordPattern, numberPattern, fallbackPattern);
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        List<string> tokens = new ArrayList();
        while (matcher.find()) {
            tokens.add(matcher.group());
        }
        return tokens;
    }

    public static void main(String[] args) {
        String input = "3.0catsdogs}qd7cats8.0dogs";
        List<string> result = tokenize(input, "cats", "dogs");
        System.out.println(result); 
        // 输出:[3.0, cats, dogs, }, q, d, 7, cats, 8.0, dogs]
    }
}</string></string></string>

⚠️ 注意事项:

  • 关键词顺序敏感:若关键词存在包含关系(如 "cat" 和 "cats"),应将更长的词放在前面,否则 "cats" 可能被 "cat" 截断;
  • 数字模式局限性:当前 d+(?:.d+)? 不匹配科学计数法(如 1e2)或负数(如 -3.0),如需支持,可增强为 -?d+(?:.d+)?(?:[eE][+-]?d+)?;
  • 性能考量:对于超长文本,交替模式仍属线性扫描,效率优于多轮循环,但大量关键词时建议预编译 Pattern 对象复用;
  • 空字符串防护:输入为空或仅含空白时,matcher.find() 自然不触发,无需额外判空。

总结:当「分割逻辑复杂且依赖上下文」时,放弃 split(),转向 find() 是更优雅、可维护性更强的正则实践范式——它将问题转化为“定义什么是有意义的 token”,而非“定义什么是分隔符”。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4716

8

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2023.07.05

3201

4

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8902

9

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

2023.08.11

812

5

正则表达式空格
正则表达式空格

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

520

5

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

693

12

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

2023.11.17

406

3

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.06

739

7

php正则表达式有哪些
php正则表达式有哪些

php正则表达式有"/pattern/"、"^"、"$"、"."、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、&a

2024.02.23

312

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JavaScript正则表达式基础与实战
JavaScript正则表达式基础与实战

共11课时 | 1.7万人学习

布尔教育正则表达式视频教程
布尔教育正则表达式视频教程

共14课时 | 5.1万人学习