跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java正则表达式
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Java正则表达式}} '''Java正则表达式'''是一种强大的文本处理工具,用于在字符串中进行模式匹配、搜索和替换操作。它基于'''正则表达式'''(Regular Expression,简称Regex)语法,广泛应用于数据验证、日志分析、文本提取等场景。本文将详细介绍Java中正则表达式的语法、核心类库及实际应用。 == 概述 == 正则表达式是由普通字符(如字母、数字)和'''元字符'''(特殊符号)组成的字符串,用于定义搜索模式。Java通过{{code|java.util.regex}}包提供正则表达式支持,主要包含以下类: * '''{{code|Pattern}}''':编译后的正则表达式模式 * '''{{code|Matcher}}''':对输入字符串执行匹配操作的引擎 == 基础语法 == 以下是常见元字符及其含义: {| class="wikitable" ! 元字符 !! 描述 |- | {{code|.}} || 匹配任意单个字符(除换行符) |- | {{code|\d}} || 匹配数字(等价于{{code|[0-9]}}) |- | {{code|\w}} || 匹配单词字符(字母、数字、下划线) |- | {{code|\s}} || 匹配空白字符(空格、制表符等) |- | {{code|^}} || 匹配字符串开头 |- | {{code|$}} || 匹配字符串结尾 |- | {{code|*}} || 匹配前一个元素0次或多次 |- | {{code|+}} || 匹配前一个元素1次或多次 |- | {{code|?}} || 匹配前一个元素0次或1次 |- | {{code|{n}}} || 精确匹配n次 |} === 字符类示例 === <syntaxhighlight lang="java"> // 检查字符串是否包含数字 String regex = "\\d+"; // 注意Java中需要转义反斜杠 String input = "Order123"; boolean matches = input.matches(".*" + regex + ".*"); System.out.println(matches); // 输出: true </syntaxhighlight> == 核心API详解 == === Pattern类 === 通过{{code|Pattern.compile()}}方法创建编译后的正则表达式对象: <syntaxhighlight lang="java"> Pattern pattern = Pattern.compile("a*b"); // 匹配0个或多个a后接b Matcher matcher = pattern.matcher("aaab"); boolean isMatch = matcher.matches(); // 完全匹配 System.out.println(isMatch); // 输出: true </syntaxhighlight> === Matcher类 === 提供丰富的匹配操作方法: * {{code|find()}}:查找下一个匹配项 * {{code|group()}}:返回匹配的字符串 * {{code|replaceAll()}}:替换所有匹配项 <syntaxhighlight lang="java"> Pattern p = Pattern.compile("\\b\\w{4}\\b"); // 匹配4字母单词 Matcher m = p.matcher("Java regex is powerful"); while (m.find()) { System.out.println(m.group()); // 输出: Java } </syntaxhighlight> == 分组与捕获 == 使用圆括号{{code|()}}创建捕获组: <syntaxhighlight lang="java"> String dateStr = "2023-12-25"; Pattern datePattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})"); Matcher dateMatcher = datePattern.matcher(dateStr); if (dateMatcher.matches()) { System.out.println("Year: " + dateMatcher.group(1)); // 2023 System.out.println("Month: " + dateMatcher.group(2)); // 12 System.out.println("Day: " + dateMatcher.group(3)); // 25 } </syntaxhighlight> == 实际应用案例 == === 案例1:邮箱验证 === <syntaxhighlight lang="java"> String emailRegex = "^[\\w.-]+@[\\w.-]+\\.[a-z]{2,6}$"; String email = "user@example.com"; System.out.println(email.matches(emailRegex)); // true </syntaxhighlight> === 案例2:日志过滤 === 提取日志中的错误信息: <syntaxhighlight lang="java"> String log = "ERROR 2023-01-01: Disk full\nWARNING 2023-01-02: Memory low"; Pattern errorPattern = Pattern.compile("ERROR (\\d{4}-\\d{2}-\\d{2}): (.+)"); Matcher errorMatcher = errorPattern.matcher(log); while (errorMatcher.find()) { System.out.println("Error at " + errorMatcher.group(1) + ": " + errorMatcher.group(2)); } // 输出: Error at 2023-01-01: Disk full </syntaxhighlight> == 性能优化 == 正则表达式可能影响性能,建议: 1. 预编译常用模式(使用{{code|Pattern.compile()}}) 2. 避免过度复杂的嵌套匹配 3. 使用'''非捕获组'''{{code|(?:...)}}当不需要提取内容时 == 高级特性 == === 零宽断言 === 匹配位置而不消耗字符: * {{code|(?=...)}}:正向先行断言 * {{code|(?<=...)}}:正向后行断言 <syntaxhighlight lang="java"> // 匹配后面跟着"px"的数字 Pattern pxPattern = Pattern.compile("\\d+(?=px)"); Matcher pxMatcher = pxPattern.matcher("16px 24pt"); pxMatcher.find(); System.out.println(pxMatcher.group()); // 输出: 16 </syntaxhighlight> === 贪婪与懒惰匹配 === 默认'''贪婪匹配'''(尽可能多匹配),添加{{code|?}}变为'''懒惰匹配''': <syntaxhighlight lang="java"> String html = "<div>content</div><p>text</p>"; Pattern greedy = Pattern.compile("<.*>"); // 匹配整个字符串 Pattern lazy = Pattern.compile("<.*?>"); // 匹配单个标签 </syntaxhighlight> == 可视化理解 == <mermaid> graph LR A[输入字符串] --> B(Pattern编译) B --> C[创建Matcher] C --> D{匹配成功?} D -->|是| E[获取匹配结果] D -->|否| F[处理失败] </mermaid> == 数学表示 == 正则表达式可以形式化为: <math> R ::= \emptyset | \epsilon | a | R \cdot R | R \cup R | R^* </math> 其中: * <math>\emptyset</math> 表示空语言 * <math>\epsilon</math> 表示空字符串 * <math>a</math> 是字母表中的字符 * <math>\cdot</math> 表示连接 * <math>\cup</math> 表示选择 * <math>*</math> 表示Kleene闭包 == 常见问题 == {{Warning|'''注意转义字符''':Java字符串中需双重转义,例如匹配数字应写为{{code|\\d}}而非{{\d}}}} {{Tip|'''调试技巧''':使用在线正则测试工具(如regex101.com)可视化匹配过程}} == 总结 == Java正则表达式是处理文本的瑞士军刀,通过掌握: 1. 基础元字符语法 2. Pattern/Matcher API 3. 分组捕获机制 4. 性能优化策略 开发者可以高效解决复杂的文本处理问题。建议从简单模式开始练习,逐步掌握高级特性。 [[Category:编程语言]] [[Category:Java]] [[Category:Java字符串]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Code
(
编辑
)
模板:Mbox
(
编辑
)
模板:Tip
(
编辑
)
模板:Warning
(
编辑
)
模板:\d
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)