Java 将字符串替换为正则表达式“quot;”*&引用;返回替换项两次
鉴于此代码:Java 将字符串替换为正则表达式“quot;”*&引用;返回替换项两次,java,regex,Java,Regex,鉴于此代码: String replaced = "A".replaceAll(".*", "HI"); 为什么replaced包含字符串HIHI,而不是我猜到的HI?这似乎与行的开头有关,因为使用模式^.*会产生HI,但我不明白原因。看看replaceAll javadoc:用给定的替换替换替换与给定正则表达式匹配的字符串的每个子字符串。 这匹配两个子字符串:“和”A“。 您可以通过测试看到这一点 String replaced = "".replaceAll( ".*", "HI" );
String replaced = "A".replaceAll(".*", "HI");
为什么
replaced
包含字符串HIHI
,而不是我猜到的HI
?这似乎与行的开头有关,因为使用模式^.*
会产生HI
,但我不明白原因。看看replaceAll javadoc:用给定的替换替换替换与给定正则表达式匹配的字符串的每个子字符串。
这匹配两个子字符串:“和”A“。
您可以通过测试看到这一点
String replaced = "".replaceAll( ".*", "HI" );
这导致打印一个“HI”我认为这是因为
*
首先匹配整个字符串,然后匹配字符串末尾的空字符串。当然,^..*
不会匹配“A”结尾的空字符串,因此只能得到一个“HI”。Matcher类的find方法查找“A”和“A”之后的空字符串,因此有两个替换。replaceAll
方法使用regex和替换参数,如下所示():-
在本例中,*
表示正则表达式
表示任何字符(可能与行终止符匹配,也可能不匹配)
*
表示零次或多次()
给定代码的输出是正确的。正则表达式与*
匹配表示零次或多次。它会影响结果
String replaced = "A".replaceAll(".*", "HI");
输出:-HIHI
希望它能对您有所帮助。在“A”中有两个位置(即字母之间):0和1。在0“A”匹配时,在1“匹配时。@无论如何,这是违反直觉的。如果
*
是贪婪的,它应该“吃掉”整个字符串,包括结尾的空字符串,并返回一次匹配。两个空字符串“a”.replaceAll(“,“HI”)==HIAHI
@AdamDyga“贪婪”(匹配可能最长的字符串)位于位置0,但在位置1,它会再次开始匹配。您可以使用+
来防止空字符串(“”
)被匹配。
String replaced = "A".replaceAll(".*", "HI");