java基础之replace,replaceAll
⾛在乡间的⼩路上---------回⾸过往。
以下代码结果都是显⽰在Console框中,所以\n会被解析成换⾏,\\n只显⽰\n。
所以看到结果换⾏其实是输出了\n,看到输出\n,其实输出的是\\n.
replace和replaceAll是编程中经常⽤到的替换函数,成功返回⼀个新的替换后的字符串,失败则返回原始字符串,它们都是替换字符串所有的符合规则的⼦串,但replaceAll接受正则表达式,所以对于普通的字符(不含正则)替换结果是⼀样的,但对于特殊的字符替换的经过则⼤相径庭。
1替换中特殊符号处理
开发中经常遇到语⾔中的特殊符号,有时要存⼊数据库,有时需要解析json中的特殊符号,有时需要显⽰特殊符号,android中的很多控件⽀持⽂本中\n换⾏,此时就会涉及到\n中的处理,当然还有很多特殊符号,这⾥以\n为例。
⾸先要想把\n存储数据库需要进⾏转义,其实是对\进⾏转义,此时从数据库中取出数据就是\\n,android中此时直接使⽤会显⽰\n⽽不是换⾏,需要替换\\n为\n时才能正确显⽰。
所以就会⽤到replace和replaceAll函数,下⾯就探讨下java中的这两个函数的⽤法。
2 java中replace和replaceAll函数
2.1例⼦
String str1 ="(1)升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验";
String str2 ="(1)升级服务\\n(2)重磅福利\\n(3)全新界⾯\\n(4)升级体验";
System.out.println(str1);
System.out.println(str2);
输出:
(1)升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
(1)升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验
java中\是特殊字符,需要转义才能使⽤,所以只有\n才能换⾏,所以java中\n代表换⾏,\\n代表\n
2.2replace 函数是替换⼀个还是替换全部
String teststr ="abcabcabcabcabc";
String teststr2 = place("a","k");
System.out.println(teststr);
System.out.println(teststr2);
result:
abcabcabcabcabc
kbckbckbckbckbc
可以看到replace 也是替换全部。
替换⼀个有函数placeFirst(regex, replacement);
2.3两个函数的区别
可以清晰地看到replaceAll⽤到了正则表达式,也就是replaceAll第⼀个参数是正则表达式。
2.4 特殊符号的处理
//存⼊数据库中的数据
String str1 ="(1)1111升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验";
String str3 = place("\n","\\n");
System.out.println(str1);
System.out.println(str3);
result(console中的结果,\n换⾏直接换⾏了,\\n会显⽰成\n,都是由于转义,所以看到结果换⾏其实是输出了\n,看到输出\n,其实输出的是\\n):
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
(1)1111升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验
正常替换,\n替换成了\\n.
//存⼊数据库中的数据
String str1 ="(1)1111升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验";
String str3 = placeAll("\n","\\n");
System.out.println(str1);
System.out.println(str3);
Result:
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
(1)1111升级服务n(2)重磅福利n(3)全新界⾯n(4)升级体验
直接使⽤replace函数上⾯的展⽰是正常的,会进⾏换⾏,但是使⽤replaceAll函数结果只剩下了n了。
上⾯说了replaceAll第⼀个参数是正则表达式,所以根据正则表达式的意义,想要替换\n写法就得根据正则表达式写法来。
\在java中代表转义,想要表⽰⼀个\字符需要\\转义之后就是,正则表达式中想要表⽰⼀个\也需要转义\\\\才能得到,所以结合java和正则表达式想要表⽰⼀个\的正则表达式需要\\\\,⾸先会被转义成\java的字符串,之后\\根据正则规则代表⼀个\,所以此时\\\\n就代表\n正则.
/
/存⼊数据库中的数据
//存⼊数据库中的数据
String str1 ="(1)1111升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验";
String str3 = placeAll("\\n","\n");
String str4 = placeAll("\\n","\\n");
String str5 = placeAll("\\n","\\\n");
String str6 = placeAll("\\n","\\\\n");
System.out.println(str1);
System.out.println("==========3==========");
System.out.println(str3);
System.out.println("=========4===========");
System.out.println(str4);
System.out.println("===========5=========");
System.out.println(str5);
System.out.println("===========6=========");
System.out.println(str6);
result:
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
3
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
=4===
(1)1111升级服务n(2)重磅福利n(3)全新界⾯n(4)升级体验
===5=
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
===6=
(1)1111升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验
//存⼊数据库中的数据
String str1 ="(1)1111升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验";
String str3 = placeAll("\\\\n","\n");
String str4 = placeAll("\\\\n","\\n");
String str5 = placeAll("\\\\n","\\\n");
String str6 = placeAll("\\\\n","\\\\n");
System.out.println(str1);
System.out.println("==========3==========");
System.out.println(str3);
System.out.println("=========4===========");
System.out.println(str4);
System.out.println("===========5=========");
System.out.println(str5);
System.out.println("===========6=========");
System.out.println(str6);
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
3
replaceall()(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
=4===
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
===5=
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
===6=
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
根据正则表达式,第⼀个参数代表的参数为\\\\n的正则,所以不会到可替换值。//存⼊数据库中的数据
String str1 ="(1)1111升级服务\\n(2)重磅福利\\n(3)全新界⾯\\n(4)升级体验";
String str3 = placeAll("\\\\n","\n");
String str4 = placeAll("\\\\n","\\n");
String str5 = placeAll("\\\\n","\\\n");
String str6 = placeAll("\\\\n","\\\\n");
System.out.println(str1);
System.out.println("==========3==========");
System.out.println(str3);
System.out.println("=========4===========");
System.out.println(str4);
System.out.println("===========5=========");
System.out.println(str5);
System.out.println("===========6=========");
System.out.println(str6);
(1)1111升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验
3
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
=4===
(1)1111升级服务n(2)重磅福利n(3)全新界⾯n(4)升级体验
===5=
(1)1111升级服务
(2)重磅福利
(3)全新界⾯
(4)升级体验
===6=
(1)1111升级服务\n(2)重磅福利\n(3)全新界⾯\n(4)升级体验
总结所以想要替换⽂本中的\n,需要第⼀个参数\n,如果要替换⽂本中的\\n,第⼀个参数需要为\\\\n.
replaceAll第⼆个参数
可以看到上⾯的代码第⼆个参数写法不同,替换后的显⽰也不相同。
replaceAll函数上部有⼀段注释:
Note that backslashes ({@code }) and dollar signs ({@code $}) in the
* replacement string may cause the results to be different than if it were
* being treated as a literal replacement string; see
* {@link Matcher#placeAll}.
* Use {@link Matcher#quoteReplacement} to suppress the special
* meaning of these characters, if desired.
受正则表达式的影响,第⼆个参数也会受到影响,特别是\和"$"符号,$符号涉及正则匹配的分组引⽤,\符号也会进⾏转义,所以要匹配\b,就要写成\\\\b,
内存中显⽰的结果就是\b,利⽤replaceAll函数替换之后就是\b(包括被转义),如果按照正则的规则想要替换所有的数字就可以写成\\d此时就会替换所有的数字。
System.out.println("xyxyxyxyxy".replaceAll("x","\\x"));
System.out.println("xyxyxyxyxy".replaceAll("x","\\\\x"));
System.out.println("xy\nxy\nxy\n".replaceAll("\\n","\\\\n"));
System.out.println("xy\nxy\nxy\n".replaceAll("\\n","\\b"));
System.out.println("xy\nxy\nxy\n".replaceAll("\\n","\\n"));
System.out.println("xy\nxy\nxy\n".replaceAll("\\n","\\\n"));
System.out.println("xy\nxy\nxy\n".replaceAll("\\n","\\\\n"));
System.out.println("==============================");
System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n","\\\\b"));
System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n","\n"));
System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n","\\n"));
System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n","\\\n"));
System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n","\\\\n"));
⼤家可以猜⼀猜上⾯代码的结果
result:
xyxyxyxyxy
\xy\xy\xy\xy\xy
xy\nxy\nxy\n
xybxybxyb
xynxynxyn
xy
xy
xy
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论