将字符串中的数字替换成$D
希望将以下字符串中的数字替换为$D字符
引用
ab1cd2
我们知道String有3个用于字符替换的方法,分别是:
- String replace(CharSequence target, CharSequence replacement):将字符串中出现的target替换成replacement;
- String replaceAll(String regex, String replacement):regex是一个正则表达式,将字符串中匹配的子字符串替换为replacement;
- String replaceFirst(String regex, String replacement):和replaceAll(..)类似,只不过只替换第一个出现的地方。
由于我们希望所有替换,因此使用如下方法:
代码1:StringReplaceTest
public class StringReplaceTest {
@Test
public void testReplace(){
String str = "ab1cd2";
System.out.println(str.replaceAll(str, "$D"));
}
}
小小代码现诡异异常
运行StringReplaceTest,控制台却没有返回正确的结果,而是抛出如下的异常:
引用
java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:713)
at java.util.regex.Matcher.replaceAll(Matcher.java:813)
at java.lang.String.replaceAll(String.java:2189)
at com.hsit.euler.qform.engine.jdbc.StringReplaceTest.testReplace(StringReplaceTest.java:17)
比较诡异吧,难道是JDK的BUG???
剥丝入茧,原来如此
其实String的replaceAll()及replaceFirst()方法内部都是调用java.util.regex.Matcher的String replaceAll(String replacement)方法的。让我们把刚才的诧异放在一边,好好看下这个方法的Javadoc,掐头去尾,主要是这段:
引用
* <p> Note that backslashes (<tt>\</tt>) and dollar signs (<tt>$</tt>) in
* the replacement string may cause the results to be different than if it
* were being treated as a literal replacement string. Dollar signs may be
* treated as references to captured subsequences as described above, and
* backslashes are used to escape literal characters in the replacement
* string.
原来是我们的替换目标串中包含了$这个特殊的字符,因为替换串使用这个引用正则表达式匹配的组,$0代表匹配项,$1代表第1个匹配分组,$1代表第2个匹配分组--终于真相大白了,是我们闯了雷区了
来看一个例子加深一个印象:
@Test
public void testReplace2(){
String str = "刘备是张飞的小弟";
System.out.println(str.replaceAll("(刘备)是(张飞)", "$2是$1"));
//=>张飞是刘备的小弟
}
李鬼出来,李逹进去
李鬼现形,处理起来自然简单:
@Test
public void testReplace(){
String str = "ab1cd2";
System.out.println(str.replaceAll(str, "\\$D"));
//=>ab$Dcd$D
}
小评一下
如果JDK可以再分析一下$,将$N即N是数字时才对其进行特殊处理,否则就不当成特殊字符,是不是更好一些呢?
也许这样并不好,必须这样造成Matcher方法为了这个小概率事件做很多复杂的检查,结果是得不偿失的。还是遇到特殊字符报异常,让开发者去处理更好些,这是28原来取舍得当的一个API设计。既然$是特殊字符,开发者绕过即可。
分享到:
相关推荐
string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置。找到返回子...
java字符串操作常用实例,String 字符串操作、比较、查找字符、替换、反转、分割等
java字符转换类代码,可以实现判断字符串是否为空,并删除首尾空格,字符串替换函数,代码转换,GBK转换为ISO-8859-1,代码转换 从srcCode转换为destCode,代码转换,GBK转换为big5,替换非法字符,标记本身等于分隔...
把旧的字符串替换成新的字符串 s oldstr newstr
软件介绍: showstring能够打开可执行文件EXE/DLL,从中搜索并替换指定的字符串。支持ASCII/UNICODE类型的字符串。能逐个字符地扫描文件,根据选项要求来设定如何搜索。
Delphi自带的StringReplace效率非常低,字符串长一些就很慢。这个速度绝对快,你可以和StringReplace比一下,
2. 前提是替换字符串里面的某些标签,也可以是多个标签,这个是在react里面的,自己可以参考然后可以动态替换成其他标签,例如li,ul都是可以的 3.字符串可以替换单个也可以替换多个的 4. 原先的想法是获取到字符串...
下面以一个字符串为例: 代码如下:string ss = “aaZ31 dd2f3”; string sss = ss.Replace(” “, “”);//将字符串ss中的空格去掉 string sss2 = Regex.Replace(ss, “[a-zA-Z]”, “”);//将字符串ss中的英文字母...
Base64转String字符串,支持将Base64转化为String字符串
首先明白一个概念,即string替换所有字符串,将”12212″这个字符串的所有”12″都替换成”21″,结果是什么? 可以是22211,也可以是21221,有时候应用的场景不同,就会希望得到不同的结果,所以这两种答案都做了...
字符串的替换操作中,发现CString::Replace运行缓慢,也无法预期它的完成时间,所以编写了一个类似CString的类,效果不错!
C++自定义string字符串类,包含字符串的常用操作以及IO流操作
用string拆分字符串 用string拆分字符串 用string拆分字符串
Android String字符串数组动态增加Android String字符串数组动态增加Android String字符串数组动态增加Android String字符串数组动态增加
现有俩个字符串,(String A; String B)如过字符串A包含字符串B那么请将字符串B倒序,然后替换它在A中的原位置。
apache中有对字符串处理的方法StringUtiles.方法名和string中replace方法的比较
string字符串含有大写字母将其中大写字母转为小写字母,代码能成功运行。
函数 语法 功能 Len Len(string|varname) 返回字符串...Replace Replace(expression,find,replacewith[,compare[,count[,start]]]) 返回字符串,其中指定数目的某子字符串(find)被替换为另一个子字符串(replacewith)。
305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)...
java的String字符串总有补0,绝对好用