在实际编程中,经常会用到将字符串中的某个字符串替换成另一个字符串的场景。最常用的替换字符串的方法是replace(),replaceFirest(),replaceAll()这三种方法。你知道这三种方法的具体区别嘛?你知道怎么替换字符串中的特殊字符嘛?
下面先看如下例子,心中预先想好会输出什么结果,然后再看运行结果:
运行结果:
看到以上运行结果是不是感到很神奇?
下面我们就仔细介绍下,为什么会出现这个的结果?
1、 public String replace(CharSequence target, CharSequence replacement)
2、 public String replace(char oldChar, char newChar)
3、 public String replaceAll(String regex, String replacement)
4、 public String replaceFirst(String regex, String replacement)
看到三个方法的参数类型,你是不是好像明白了。
有很多人认为replace是替换单个字符串,replaceAll是替换所有匹配项。其实这只是对replace方法名的曲解。replace只是没有用到正则表达式,但依然会替换掉字符串中所有的匹配项。
replaceAll和replaceFirst这两个方法在替换字符串时使用到了正则表达式。当第一个参数是正则表达式的元字符时,replaceAll方法会按照正则表达式“.”匹配的所有内容都替换掉。replaceFirst使用方法同replaceAll一样,只是replaceFirst只会替换掉第一个匹配项。
有的小伙伴可能又有疑问了,“如果我不想使用正则表达式规则去替换,怎么办呢?”。
其实很简单,那就用replace方法直接替换就可以了。
问题又来了,如果我不想使用replace呢,我任性我傲娇,只想用replaceAll,怎么办呢?
其实也简单,你只需要把字符串转义过来就搞定了。
System.out.println(s.replaceAll("\\.", "#"));
运行结果:
fireline#qtest#cn
在Java字符串的处理中还有split方法也是识别正则表达式的。小伙伴们在使用的时候要多注意,以免踩坑。
以下是会被正则表达式识别的常见字符列表:
元字符 | 描述 |
\ | 将下一个字符标记符、或一个向后引用、或一个八进制转义符。即相当于多种编程语言中都有的“转义字符”的概念。 |
^ | 匹配输入字行首。 |
$ | 匹配输入行尾。 |
* | 匹配前面的子表达式任意次。 |
+ | 匹配前面的子表达式一次或多次(大于等于1次)。 |
? | 匹配前面的子表达式零次或一次。 |
{n} | n是一个非负整数。匹配确定的n次。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 |
.点 | 匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。 |
\d | 匹配一个数字字符。等价于[0-9]。 |
\n | 匹配一个换行符。 |
\r | 匹配一个回车符。 |
\s | 匹配任何不可见字符,包括空格、制表符、换页符等等。 |
\t | 匹配一个制表符。 |
( ) | 将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。 |
| | 将两个匹配条件进行逻辑“或”(Or)运算。 |