【发布时间】:2013-04-22 10:05:40
【问题描述】:
鉴于此代码:
String replaced = "A".replaceAll(".*", "HI");
为什么replaced 包含字符串HIHI 而不是我猜到的HI?由于使用模式^.* 产生HI,这似乎与行首有关,但我不明白这是为什么。
【问题讨论】:
-
可以使用
.+防止空字符串("")被匹配。
鉴于此代码:
String replaced = "A".replaceAll(".*", "HI");
为什么replaced 包含字符串HIHI 而不是我猜到的HI?由于使用模式^.* 产生HI,这似乎与行首有关,但我不明白这是为什么。
【问题讨论】:
.+防止空字符串("")被匹配。
我认为这是因为.*首先匹配整个字符串,然后匹配字符串末尾的空字符串。当然,^.* 不会匹配 "A" 末尾的空字符串,所以你最终只会得到一个 "HI"。
【讨论】:
查看replaceAll javadoc:用给定的替换替换此字符串中与给定正则表达式匹配的每个子字符串。 这匹配两个子字符串:“”和“A”。 你可以通过测试看到这一点
String replaced = "".replaceAll( ".*", "HI" );
这会导致打印一个“HI”
【讨论】:
.* 是贪婪的,它应该“吃掉”整个字符串包括末尾的空字符串并返回一次匹配。
"A".replaceAll("", "HI")==HIAHI
Matcher类的find方法找到“A”和“A”后面的一个空String,所以有2个替换。
【讨论】:
replaceAll 方法采用正则表达式和替换参数,如 (read more):-
public String replaceAll(String regex,
String replacement)
在本例中,.* 表示正则表达式。
. 表示任何字符(可能匹配行终止符,也可能不匹配)
* 表示零次或多次(Read More regexp)
您给定代码的输出是正确的。正则表达式与 * 匹配表示零次或多次。而且会影响结果。
String replaced = "A".replaceAll(".*", "HI");
输出:- HIHI
希望对你有帮助。
【讨论】: