【Java/Regular Expression】在Java中使用正则表达式处理文本的几种典型模式(验证、查找和更替)
本文不是讲述正则表达式如何写的,如果想知道这一点,请自行购买以下书籍阅读:
注意:作者的这本书真是绝了,言简意赅,直中要害,相对而言市面上的同类书籍显得超沉超重,废话较多。但是,这作者的这一本书值得花钱,因为他用心去写了;但他的其它书就不一定了,我个人觉得是续貂之作。各位看官请明辨!
本文是讲述Java里如何使用正则表达式帮助我们完成字符串验证、查找和更替业务的,代码如下:
import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 正则表达式常见使用案例 * @author heyang * */ public class RegExp { /** * 验证例子,使用Pattern.matches * 看一个字符串是否符合某个模式,常用于英数字验证、号码验证、汉字平片假名验证等 * @param code * @return */ private static boolean verify(String code) { final String patternStr = "\\d{6}"; return Pattern.matches(patternStr, code); } /** * 验证例子二,使用string.matches * @param cmd * @return */ private static boolean isAllowed3Cmd(String cmd) { return cmd.matches("^(?i)(create|delete|listall)$"); } /** * 更替例子,将符合模式的字符串替换成别的字符串 */ private static void replaceAll() { String str = "10元 1000人民币 10000元 100000RMB"; String newstr = str.replaceAll("(\\d+)(元|人民币|RMB)", "$1圆"); System.out.println(newstr); } /** * 查找例子 * 本例只查找位置,不进行处理 */ private static void search() { Pattern pattern = Pattern.compile("m(o+)n", Pattern.CASE_INSENSITIVE); Matcher matcher=pattern.matcher("Sun Earth moon mooon Mon mooooon Mooon Mars"); while(matcher.find()) { System.out.println(String.format("%s (%d~%d)", matcher.group(0),matcher.start(),matcher.end())); } } /** * 查找符合模式的部分进行更替 */ private static void findandReplace() { String rawSql="select * from a=:av and b=:bv and c=:cv and d = : dv"; System.out.println("rawSql="+rawSql); // 模拟输入的条件 Map<String,String> map=new HashMap<>(); map.put("av", "1"); //map.put("bv", "2");// 被屏蔽的表示此条件未输入 map.put("cv", "3"); map.put("dv", "4"); Pattern pattern=Pattern.compile("((\\w+)\\s*[=]\\s*)([:]\\s*(\\w+))"); Matcher matcher=pattern.matcher(rawSql); boolean found=matcher.find(); StringBuilder sb=new StringBuilder(); while(found) { String value=matcher.group(4); if(map.containsKey(value)) { matcher.appendReplacement(sb, matcher.group(1)+map.get(value)); }else { matcher.appendReplacement(sb, "1=1"); } found=matcher.find(); } matcher.appendTail(sb); String finalSql=sb.toString(); System.out.println("finalSql="+finalSql); } public static void main(String[] args) { System.out.println(String.format("601857 %s a stock code.",verify("601857")?"is":"isn't")); String cmd="Create"; System.out.println(String.format("%s %s a legal command.",cmd,isAllowed3Cmd(cmd)?"is":"isn't")); search(); replaceAll(); findandReplace(); } }
输出:
601857 is a stock code. Create is a legal command. moon (10~14) mooon (15~20) Mon (21~24) mooooon (25~32) Mooon (33~38) 10圆 1000圆 10000圆 100000圆 rawSql=select * from a=:av and b=:bv and c=:cv and d = : dv finalSql=select * from a=1 and 1=1 and c=3 and d = 4
END
分类:
Java.正则
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2019-09-26 最简SpringBoot程序制法
2017-09-26 【Canvas】逐像素在canvas中显示一张图片
2017-09-26 【Canvas与图标】蓝色数据库图标
2017-09-26 【Canvas与诗词】什么力也瞬灭不了火炭般的眼睛...
2017-09-26 【Canvas与图标】正方形牛皮纸文件袋图标
2017-09-26 【Canvas与图标】蓝色三角函数图标(120*120)
2017-09-26 【Canvas与技法】绘制简化“美元”标志