正则表达式异常强大,一直理解不深,用的也不深,这次项目中尝试,体会到了它的强大之处。字符串查找,匹配,替换,正则无不能做,特别是灵活的运用子串匹配得到的变量值$1,$2,再进行二次处理能够达到很巧妙的效果。

Java中使用也比较简单:

1. 编译正则表达式的字面值得到对应的模式Pattern对象;

2. 创建匹配给定输入与此模式的匹配器Matcher;

3. 通过匹配器对象执行操作,匹配器对象的方法很丰富,方法之间组合使用更加强大。

直接代码吧

public static void main(String[] args) {//被替换关键字的的数据源Map<String,String> tokens = new HashMap<String,String>();tokens.put("cat", "Garfield");tokens.put("beverage", "coffee");//匹配类似velocity规则的字符串String template = "${cat} really needs some ${beverage}.";//生成匹配模式的正则表达式String patternString = "\\$\\{(" + StringUtils.join(tokens.keySet(), "|") + ")\\}";Pattern pattern = Pattern.compile(patternString);Matcher matcher = pattern.matcher(template);//两个方法:appendReplacement, appendTailStringBuffer sb = new StringBuffer();while(matcher.find()) {matcher.appendReplacement(sb, tokens.get(matcher.group(1)));}matcher.appendTail(sb);//out: Garfield really needs some coffee.System.out.println(sb.toString());//对于特殊含义字符"\","$",使用Matcher.quoteReplacement消除特殊意义matcher.reset();//out: cat really needs some beverage.System.out.println(matcher.replaceAll("$1"));//out: $1 really needs some $1.System.out.println(matcher.replaceAll(Matcher.quoteReplacement("$1")));//到得邮箱的前缀名。插一句,其实验证邮箱的正则多种多样,根据自己的需求写对应的正则才是王道String emailPattern = "^([a-z0-9_\\.\\-\\+]+)@([\\da-z\\.\\-]+)\\.([a-z\\.]{2,6})$";pattern = Pattern.compile(emailPattern);matcher = pattern.matcher("test@qq.com");//验证是否邮箱System.out.println(matcher.find());//得到@符号前的邮箱名  out: testSystem.out.println(matcher.replaceAll("$1"));//获得匹配值String temp = "<meta-data android:name=\"appid\" android:value=\"joy\"></meta-data>";pattern = Pattern.compile("android:(name|value)=\"(.+?)\"");matcher = pattern.matcher(temp);while(matcher.find()) {//out: appid, joySystem.out.println(matcher.group(2));}
}

一些老是忘基础

[...] 位于括号之内的任意字符

[^...] 不在括号之中的任意字符

. 除了换行符之外的任意字符,等价于[^\n]

\w 任何单字字符, 等价于[a-zA-Z0-9]

\W 任何非单字字符,等价于[^a-zA-Z0-9]

\s 任何空白符,等价于[\ t \ n \ r \ f \ v]

\S 任何非空白符,等价于[^\ t \ n \ r \ f \ v]

\d 任何数字,等价于[0-9]

\D 除了数字之外的任何字符,等价于[^0-9]

[\b] 一个退格直接量(特例)

{n, m} 匹配前一项至少n次,但是不能超过m次

{n, } 匹配前一项n次,或者多次

{n} 匹配前一项恰好n次

? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}

+ 匹配前一项1次或多次,等价于{1,}

* 匹配前一项0次或多次.等价于{0,}

| 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式

(...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引用使用

\n 和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数

^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头

$ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾

\b 匹配的是一个词语的边界.简而言之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符)

\B 匹配的是非词语的边界的字符

题外话

邮箱验证,以前验证邮箱,网上搜个正则装在自己程序里面就用,其实这是不对的,不同的公司对邮箱的验证格式是不一样的,比方说163和qq邮箱注册,他们要求的格式都不一样,所以搜一个正则表达式就去套所有的邮箱格式也是不对的,符合自己的需求的正则才是正确的。

[原]Java 正则 多子串 匹配 替换相关推荐

  1. java 正则拼音_匹配中文普通话汉字拼音正则表达式

    直接上表达式: (a[io]?|ou?|e[inr]?|ang?|ng|[bmp](a[io]?|[aei]ng?|ei|ie?|ia[no]|o|u)|pou|me|m[io]u|[fw](a|[a ...

  2. java 正则 惰性匹配_正则表达式 - 贪婪与非贪婪(惰性)

    使用场景 有时,我们想用正则匹配以某个子串开头,且以某个子串或字符结尾的子字符串,但是结尾的字串或字符在原字符串中出现了多次,但我们只想匹配从开始处到第一次出现的地方,换句话说,想得到开始和结尾之间内 ...

  3. java正则匹配买火车票_matlab的正则表达式

    regexp--用于对字符串进行查找,大小写敏感: regexpi--用于对字符串进行查找,大小写不敏感: regexprep--用于对字符串进行查找并替换. 第一部分--单个字符的匹配 1 句点符号 ...

  4. Java正则的全量匹配和部分匹配

    一,前言 我们在用String.matches()的时候发现字符串中有能匹配的地方却返回为false.如: String abc = "regex.1234561";boolean ...

  5. java正则手机号_Java正则替换手机号代码实例

    在日常生活中,我们经常会遇到将一个手机号的4-7位字符串用正则表达式替换为为星号"*".这是出于对安全性和保护客户隐私的考虑将程序设计成这样的.下面我们就来看看具体代码. pack ...

  6. java正则表达 替换_正则表达式 replace()替换

    标签: 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp,replaceme ...

  7. java 正则 空白字符_关于JAVA正则匹配空白字符的问题

    今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示"\u3000" ,这是什么? 这是全角空格!!! 查了一下    \s   ...

  8. java正则任意字符_正则表达式匹配任意字符(包括换行符)的写法

    今天在Java中想使用正则表达式来获取一段文本中的任意字符.于是很随意得就写出如下匹配规则: (.*) 结果运行之后才发现,无法获得换行之后的文本.于是查了一下手册,才发现正则表达式中,". ...

  9. Java正则匹配提取年月日字符串

    Java正则匹配提取年月日字符串 String string1="9999-9-99";Pattern p = Pattern.compile("(\\d{4})-(\\ ...

最新文章

  1. 面试命中率 90% 的点 :MySQL 锁
  2. windows环境下的zookeeper安装
  3. hdu1846巴什博弈(java)
  4. 终端服务器超过了 最大连接数
  5. BZOJ 1072 排列
  6. 泰康应用盒子Android,泰康医疗app下载-泰康医疗 安卓版v1.8.8-PC6安卓网
  7. 两个ROS系统进行通信(通过路由器,可上网)
  8. 51单片机实战教程基础硬件篇(一 电子元件PCB 封装库设计教程)
  9. IPAD上访问WINDOWS环境远程桌面---三款软件比较
  10. 队列——数据结构严蔚敏C语言版
  11. TP5之微信小程序推送模板消息
  12. arm开发板(I.MX6U)ping通虚拟机Ubuntu方法
  13. Creo 5.0软件安装教程|兼容WIN10
  14. 怎样将excel表格导入天正_怎样把excel表格转换成cad读取
  15. 百亿互刷宝php 站长,百度排名百亿互刷宝
  16. python 二维坐标多边形 计算多边形中心点,以及距该中心点最远的距离
  17. 【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游
  18. Python学习笔记(十一)——第三十讲
  19. RichEdit读取rtf格式
  20. 扎克伯格:元宇宙,就是下一张互联网

热门文章

  1. 4句话让你明白什么是AI
  2. 为什么数学家、统计学家和机器学习专家会用不同方式解决问题?
  3. 20210709未来智能实验室收录资料
  4. 5分钟,看尽芯片和摩尔定律“你追我赶”的抗衡50年
  5. 物理哲学和生物哲学的对抗
  6. 解析1G到5G技术与设备发展历程
  7. 谷歌、苹果等大佬亲自戳穿自动驾驶完美童话,技术、场景、安全牢笼实难突围!...
  8. 2017年深度学习重大研究进展全解读
  9. 一个三本程序猿的大厂逆袭之路
  10. 后疫情时代,如何重构数字战斗力?