String replaceAll 正则注意事项及特殊用法(xjl456852原创)

类似于正则的用法. \\\\四个反斜线,最后会表示为一个\反斜线.String s = "a(bc)d_abcd";System.out.println(s.replaceAll("_", "\\\\_"));结果:a(bc)d\_abcd
String testg = "amfooniceshow";//$2 相当于对前面正则表达式的第二组进行引用System.out.println(testg.replaceAll("(am)(foo)", "$2haha"));结果:foohahaniceshow
String test1 = "hahaamfooniceshowerqwhdfgsd";System.out.println(test1.replaceAll("(?<sho>)wer", "${sho}123456"));结果:hahaamfoonicesho123456qwhdfgsd
//结果是1, 相当于有一个组,这种是()被认为是一个分组.Pattern p = Pattern.compile("(?<xxx>)");System.out.println(p.matcher("ab").groupCount());//常规的结果是0, 相当于没有新建分组Pattern pp = Pattern.compile("xxx");System.out.println(pp.matcher("ab").groupCount());//常规的非捕获组结果也是0, 相当于没有新建分组Pattern ppp = Pattern.compile("(?<=xxx)");System.out.println(ppp.matcher("ab").groupCount());
package com.xjl456852.manager;import java.util.regex.Matcher;/*** Created by xjl456852 on 2017/3/9.*/public class StringTest {public static void main(String args[]) {String s = "a(bc)d_abcd";System.out.println(s.replaceAll("_", "\\\\_"));//会出错// System.out.println(s.replaceAll("_", "\\\\$"));System.out.println(s.replaceAll("_", "\\\\\\$"));//可用Matcher.quoteReplacement() 对replaceAll的第二个参数进行转义System.out.println(s.replaceAll("_", Matcher.quoteReplacement("\\$")));System.out.println(s.replaceAll("_", "\\$"));System.out.println(s.replaceAll("_", "\\."));System.out.println(s.replaceAll("_", "."));System.out.println(s.replaceAll("_", "\\\\%"));System.out.println(s.replaceAll("_", "\\5"));System.out.println(s.replaceAll("_", "5"));System.out.println(s.replaceAll("_", "5"));System.out.println(s.replaceAll("_", "\""));System.out.println(s.replaceAll("_", "\\\""));System.out.println(s.replaceAll("_", "\\${1}"));//会出错 ${} 这个大括号里面不能是数字// System.out.println(s.replaceAll("_", "${1}"));String testg = "amfooniceshow";//$2 相当于对前面正则表达式的第二组进行引用System.out.println(testg.replaceAll("(am)(foo)", "$2haha"));System.out.println("--------------");String test = "hahaam${foo}niceshow";System.out.println(test.replaceAll("\\$\\{.*\\}", "\\\\\\$\\{ss\\}"));System.out.println(test.replaceAll("\\$\\{.*\\}", Matcher.quoteReplacement("\\${ss}")));//会出现错误// System.out.println(test1.replaceAll("\\$\\{.*\\}", "${ss}"));}}
a(bc)d\_abcda(bc)d\$abcda(bc)d\$abcda(bc)d$abcda(bc)d.abcda(bc)d.abcda(bc)d\%abcda(bc)d5abcda(bc)d5abcda(bc)d5abcda(bc)d"abcda(bc)d"abcda(bc)d${1}abcdfoohahaniceshow--------------hahaam\${ss}niceshowhahaam\${ss}niceshow
package com.xjl456852.manager;import java.util.regex.Pattern;/*** Created by xjl456852 on 2017/3/9.*/public class StringTest {public static void main(String args[]) {System.out.println("下面是${name}格式的replaceAll替换");String test1 = "hahaamfooniceshowerqwhdfgsd";System.out.println("--------------------");//${name} 属于有名字的领宽度匹配的引用.name必须是大写或小写字母,不能是其它符号或者数字.这种用法真是少见,感觉没什么实际的意义.//${name} 中的name,是一种分组的名字,也就是说在前面的正则中需要写入这样的名字.而且这个名字的写法比较特殊.//我查看源码之后了解到这种写法必须是<?name>的格式.//例如下面.它的意思是:sho为零宽度匹配,这个可以匹配werSystem.out.println(test1.replaceAll("(?<sho>)wer", "${sho}123456"));//下面这两个虽然按理说不能匹配wer,因为<sh>中少了个o,但其实可以匹配wer(这种用法真是不知道在那种场景中才能用到),所以将wer替换为123456System.out.println(test1.replaceAll("(?<sh>)wer", "123456"));System.out.println(test1.replaceAll("(?<sh>)wer", "${sh}123456"));//这个参数b中使用了$1,而(?<sh>)会被认为是一个分组,但是这个又是零宽度的,所以$1相当于没有引用.而$1已经被使用,所以1不会打印出来,只会打印23456System.out.println(test1.replaceAll("(?<sh>)wer", "$123456"));System.out.println("----------------------");//下面这两个写的<xxx>这种字符是不存在的,但是后面的we也会被替换System.out.println(test1.replaceAll("(?<xxx>)we", "123${xxx}456"));//下面这个和上面那个一样,<xxx>这个是不存在的,但是ho和we都会被替换掉System.out.println(test1.replaceAll("ho(?<xxx>)we", "123${xxx}456"));//这个h后面少了o,后面紧接着是we,故无法匹配字符串,所以会以原字符串输出System.out.println(test1.replaceAll("h(?<xxx>)we", "123${xxx}456"));System.out.println("------------------");//这个也匹配不到,所以无法替换,所以会以原字符串输出System.out.println(test1.replaceAll("(?<sho>)dwer", "123456"));//下面这两个都是领宽度匹配,前后都没条件,无论<>中写的是什么字符串,前后都没有条件,就不会匹配任何字符串,按领宽度匹配处理,所以会在每个字符串的前后都插入123.System.out.println(test1.replaceAll("(?<sho>)", "123"));System.out.println(test1.replaceAll("(?<xxx>)", "123"));System.out.println("=============================");//这个是用非捕获组进行的匹配.会在sh后面插入123System.out.println(test1.replaceAll("(?<=sh)", "123"));//其实用非捕获字也能实现这种每个字符的前后都插入相同目标字符串的功能.但是这个有一个特点就是原字符串中必须不包含xxxSystem.out.println(test1.replaceAll("(?<!xxx)", "123"));//比如下面的这个,原字符串中就包含sh,使用?<!sh ,意思是不是sh的字符串都插入123.这时结果跟上一个字符串相比就少了一组123.// 因为检查到字符s时,发现不是sh,所以会插入123,再次检查到h时,发现是sh,所以不插入,这时会跳过.h后面就会少一组123System.out.println(test1.replaceAll("(?<!sh)", "123"));System.out.println("-------------");//下面是一些其它的写法可以根据结果自己理解.System.out.println(test1.replaceAll("(?<ha>)haam.*?(ce)(?<sh>).*?(fg)", "12${ha}34${sh}56"));System.out.println(test1.replaceAll("(?<ha>)haam", "123456${ha}"));System.out.println(test1.replaceAll("(ce)(?<sh>)", "1234${sh}56"));System.out.println(test1.replaceAll("ce(?<sh>)", "123456"));System.out.println("-------------");System.out.println(test1.replaceAll("(?<sh>)ow", "1234${sh}56"));System.out.println(test1.replaceAll("(?<sh>)ow", "123456"));System.out.println("-------------");System.out.println(test1.replaceAll("(ce)(?<sh>)(ow)", "1234${sh}56"));System.out.println(test1.replaceAll("ce(?<sh>)ow", "1234${sh}56"));System.out.println(test1.replaceAll("(?<sh>)", "1234${sh}56"));System.out.println(test1.replaceAll("(?<haam>)", "123${haam}456"));System.out.println("---------------------");System.out.println(test1.replaceAll("(?<xxx>)", "123${xxx}456"));System.out.println(test1.replaceAll("(?<xxx>)", "123456"));//结果是1, 相当于有一个组,这种是()被认为是一个分组.Pattern p = Pattern.compile("(?<xxx>)");System.out.println(p.matcher("ab").groupCount());//常规的结果是0, 相当于没有新建分组Pattern pp = Pattern.compile("xxx");System.out.println(pp.matcher("ab").groupCount());//常规的非捕获组结果也是0, 相当于没有新建分组Pattern ppp = Pattern.compile("(?<=xxx)");System.out.println(ppp.matcher("ab").groupCount());}}
下面是${name}格式的replaceAll替换--------------------hahaamfoonicesho123456qwhdfgsdhahaamfoonicesho123456qwhdfgsdhahaamfoonicesho123456qwhdfgsdhahaamfoonicesho23456qwhdfgsd----------------------hahaamfoonicesho123456rqwhdfgsdhahaamfoonices123456rqwhdfgsdhahaamfooniceshowerqwhdfgsd------------------hahaamfooniceshowerqwhdfgsd123h123a123h123a123a123m123f123o123o123n123i123c123e123s123h123o123w123e123r123q123w123h123d123f123g123s123d123123h123a123h123a123a123m123f123o123o123n123i123c123e123s123h123o123w123e123r123q123w123h123d123f123g123s123d123=============================hahaamfoonicesh123owerqwhdfgsd123h123a123h123a123a123m123f123o123o123n123i123c123e123s123h123o123w123e123r123q123w123h123d123f123g123s123d123123h123a123h123a123a123m123f123o123o123n123i123c123e123s123ho123w123e123r123q123w123h123d123f123g123s123d123-------------ha123456sdha123456fooniceshowerqwhdfgsdhahaamfooni123456showerqwhdfgsdhahaamfooni123456showerqwhdfgsd-------------hahaamfoonicesh123456erqwhdfgsdhahaamfoonicesh123456erqwhdfgsd-------------hahaamfooniceshowerqwhdfgsdhahaamfooniceshowerqwhdfgsd123456h123456a123456h123456a123456a123456m123456f123456o123456o123456n123456i123456c123456e123456s123456h123456o123456w123456e123456r123456q123456w123456h123456d123456f123456g123456s123456d123456123456h123456a123456h123456a123456a123456m123456f123456o123456o123456n123456i123456c123456e123456s123456h123456o123456w123456e123456r123456q123456w123456h123456d123456f123456g123456s123456d123456---------------------123456h123456a123456h123456a123456a123456m123456f123456o123456o123456n123456i123456c123456e123456s123456h123456o123456w123456e123456r123456q123456w123456h123456d123456f123456g123456s123456d123456123456h123456a123456h123456a123456a123456m123456f123456o123456o123456n123456i123456c123456e123456s123456h123456o123456w123456e123456r123456q123456w123456h123456d123456f123456g123456s123456d123456100
String replaceAll 正则注意事项及特殊用法(xjl456852原创)的更多相关文章
- JAVA中string.replace()和string.replaceAll()的区别及用法
乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样. public String r ...
- [转]String.Replace 和 String.ReplaceAll 的区别
JAVA 中的 replace replaceAll 问题: 测试code System.out.println("1234567890abcdef -----> "+&qu ...
- Java String.replaceAll() 与后向引用(backreference)
问题 昨天看到一篇博文,文中谈到一道 Java 面试题: 给定一字符串,若该字符串中间包含 "*",则删除该 "*":若该字符串首字符或尾字符为 "* ...
- Java用代码演示String类中的以下方法的用法
用代码演示String类中的以下方法的用法 (1)boolean isEmpty(): 判断字符串是不是空串,如果是空的就返回true (2)char charAt(int index): 返回索引上 ...
- Java String.replaceAll()方法
声明 以下是java.lang.String.replaceAll()方法的声明 public String replaceAll(String regex, String replacement) ...
- String replaceAll(String regex,String str)满足正则表达式的部分替换为给定内容
package seday02;/*** * String replaceAll(String regex,String str)* @author xingsir*/public class Rep ...
- (转)正则表达式:string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement
string.replaceAll中的特殊字符 string.replaceAll(String regex, String replacement)中的replacement参数即替换内容中含有特殊 ...
- 1.用代码演示String类中的以下方法的用法 (2018.08.09作业)
public class Test_001 { public static void main(String[] args) { String a = "德玛西亚!"; Strin ...
- String formate的语法解析及简单用法
转自:https://blog.csdn.net/jiangyu1013/article/details/52607257 package cn.wuxiangbin.StringFormat; im ...
随机推荐
- 栗染-Myeclispe连接SQL Server数据库
第一步,在SQL server方面 这里是以身份验证登录. 这里我是建了一个hw的数据库,其他没啥说的. 第二步,最主要的一部分 因为第一次连接SQL Server数据库,所以就不知道还有这一步.不然 ...
- bzoj 4326: NOIP2015 运输计划【树链剖分+二分+树上差分】
常数巨大,lg上开o2才能A 首先预处理出运输计划的长度len和lca,然后二分一个长度w,对于长度大于w的运输计划,在树上差分(d[u]+1,d[v]+1,d[lca]-2),然后dfs,找出所有覆 ...
- Springboot拦截器线上代码失效
今天想测试下线上代码,能否正常的执行未登录的拦截.所以把拦截器的代码给开放出来,但是没想到线上代码addInerceptors(InterceptorRegistry registry) 这个方法一直 ...
- JavaScript编程艺术-第10章-10.2-实用的动画
10.2-实用的动画 ***代码亲测可用*** HTML: <!DOCTYPE HTML> <html> <head> <meta charset=" ...
- [AHOI2006] 文本编辑器editor
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对"文本编辑器"做了一个抽象的定义: ...
- 洛谷 P3437 [POI2006]TET-Tetris 3D
二维线段树区间更新啊 树套树的外层树,如果是线段树的话一般似乎不能打标记?(毕竟标记不好下传) 然而起码对于这题是可以的...对于外层线段树,每个节点放两个内层线段树dat和setv,分别是得到的值和 ...
- HTML基础2——综合案例1——如何用iis配置网站
1.打开iis 如果机子上面没有iis,可以先装一个,不同的系统可能安装步骤不一样,至于iis的安装方法,大家可以去百度找找. 2.准备网站源程序 既然要配置网站,肯定要先准备好网站源程序,网 ...
- TypeError: string indices must be integers, not str
1. TypeError: string indices must be integers, not str 字符串类型取第index个字符的时候,应该传入int而不是str.如 1 a='abcde ...
- (转)解决office软件无法卸载也无法安装的顽固问题
原文地址 http://jingyan.baidu.com/article/f3ad7d0fcfe32509c3345bab.html 有时会出现office下载失败,然后又无法重新安装,导致offi ...
- windows服务器监控多个tomcat运行状态
第一步,修改tomcat默认的进程名 因为所有的tomcat项目的进程名默认都叫java.exe,所以需要修改tomcat容器bin目录下的setclasspath.bat.注释掉:(在set前加上 ...