java.lang.String类为替换字符串提供了2个方法replace()和replaceAll(),从字面意思理解,replace()是将字符串中出现的所有字符(串)用指定的字符(串)替换,要注意是所有的字符(串),如
String str = "q2?12?ew"; str = str.replace("?", ""); System.out.println(str); 结果:q212ew
如果将“?”进行转义,则结果却不一样
String str = "q2?12?ew"; str = str.replace("\\?", ""); System.out.println(str); 结果:q2?12?ew
因为str.replace("\\?", "")表示将str字符串中出现"\\?"的字符全部替换为""。如果想用正则表达式替换字符串,这时就需要使用replaceAll方法了,这个方法是专门为正则表达式设计的,replaceAll(String regex, String replacement)第一个参数是正则表达式,第二个参数是待替换的值。其中正则表达式的关键字有
字符 | 说明 |
^ | 匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^" |
$ | 匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$" |
( ) | 标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)" |
[ ] | 用来自定义能够匹配 ‘多种字符‘ 的表达式。要匹配中括号,请使用 "\[" 和 "\]" |
{ } | 修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}" |
. | 匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\." |
? | 修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?" |
+ | 修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+" |
* | 修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*" |
| | 左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|" |
String str = "q2?12?ew"; str = str.replaceAll("?", ""); System.out.println(str); 结果:Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character ‘?‘ near index 0 因为"?"是修饰匹配次数为 0 次或 1 次,所以"?"不是一个正确的正则表达式,若要能正确运行,需要将"?"进行转义,代码为:str = str.replaceAll("\\?", "");
此时如果运行一下代码,情况则又完全不一样了
String str = "q2.12.ew"; str = str.replaceAll(".", ""); System.out.println(str); 结果:空字符串,因为"."表示匹配除了换行符以外的任意字符,"q2.12.ew"字符串所有的字符均符合替换规则,所以全部被替换成""。此时需要将"."进行转义,代码为:str = str.replaceAll("\\.", "");
但是转义符也不能乱用,不能将不是正则表达式所规定的特殊字符进行转义,否则结果会出乎意料,用如下代码说明
String str = "q2.12.ew"; str = str.replaceAll("\\2", ""); System.out.println(str); 结果:q2.12.ew。相当于字符串没被替换,因为此时是查找"q2.12.ew"字符串,将其中的"\\2"字符串替换成"",注意是"\\2"字符串
String的replace()方法和replaceAll()使用
原文:http://my.oschina.net/u/732520/blog/522065