String replace()和replaceAll()之间的区别

Jij*_*joy 203 java string replace

除了以后使用正则表达式之外,java.lang.String replace()replaceAll()方法之间有什么区别?对于简单的换人一样,代替./ ,有什么不同?

emi*_*lan 163

java.lang.String,该replace方法要么采用一对char或一对CharSequence(其中String是一个子类,所以它很乐意接受一对String).该replace方法将替换所有出现的char或CharSequence.在另一方面,这两个String参数replaceFirstreplaceAll正则表达式(正则表达式).使用错误的功能可能会导致细微的错误.

  • 另外,根据java文档,每次调用`str.replaceAll(regex,repl)`都与`Pattern.compile(regex).matcher(str).replaceAll(repl)`相同.因此,根据使用量的不同,会产生很大的开销. (29认同)
  • @ user845279有趣的是你会说,因为`String#replace(target,replacement)`做同样的事情,除了它引用字符串:`Pattern.compile(target.toString(),Pattern.LITERAL).matcher(this) .replaceAll(Matcher.quoteReplacement(replacement.toString()));`是否有一些理由为什么`String#replace`会比`String#replaceAll`更快?它似乎不像它,因为`String#replace`只是执行额外的操作. (2认同)
  • 只是好奇,在这个答案中,与“replaceAll”的显式比较在哪里。答案更多是关于“替换” (2认同)

pau*_*sm4 85

问:什么是之间的区别java.lang.String方法replace()replaceAll(),比后来的使用正则表达式等.

答:只是正则表达式.他们都取代所有 :)

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

PS:

还有一个replaceFirst()(需要正则表达式)

  • @JohnnyFive 这让它更加混乱。正则表达式不是一种类型,`CharSequence` 是。`replace()` 和 `replaceAll()` 都“与 `CharSequence` 一起使用”。这是因为`replaceAll()` 将给定的`CharSequence` 视为正则表达式,因此它会查找_regex 匹配_,而`replace()` 将给定的`CharSequence` 视为纯搜索文本,因此它会查找其中的_occurrences_。 (5认同)
  • 感谢澄清它只是正则表达式。我多么希望他们将它命名为 replaceWithRegex() 而不是 replaceAll() (2认同)

Sur*_*ran 33

replace()方法被重载以接受基元charCharSequence作为参数.

现在就性能而言,该replace()方法比replaceAll()后者首先编译正则表达式模式然后在最终替换之前匹配而前者只是匹配提供的参数并替换时快一点.

因为我们知道正则表达式模式匹配是一个稍微复杂一些,因此速度较慢,则宁愿replace()replaceAll()建议只要有可能.

例如,对于您提到的简单替换,最好使用:

replace('.', '\\');
Run Code Online (Sandbox Code Playgroud)

代替:

replaceAll("\\.", "\\\\");
Run Code Online (Sandbox Code Playgroud)

注意:上述转换方法参数与系统有关.

  • 甚至替换也做同样的事情,从java String docs ::**public String replace(CharSequence target,CharSequence replacement){return Pattern.compile(target.toString(),Pattern.LITERAL).matcher(this).replaceAll(Matcher) .quoteReplacement(replacement.toString())); }** (6认同)
  • @Prateek:在jdk8之后,String::replace不再使用Pattern:https://hg.openjdk.java.net/jdk9/jdk9/jdk/file/65464a307408/src/java.base/share/classes/java/ lang/String.java#l2152 ,jdk11 中相同。 (2认同)

Sur*_*gch 33

无论replace()replaceAll()替换字符串中所有出现.

例子

我总能找到有助于理解差异的例子.

replace()

使用replace(),如果你只是想更换一些char与另一个char或一些String与另一个String(实际上CharSequence).

例1

替换字符出现的所有xo.

String myString = "__x___x___x_x____xx_";

char oldChar = 'x';
char newChar = 'o';

String newString = myString.replace(oldChar, newChar);
// __o___o___o_o____oo_
Run Code Online (Sandbox Code Playgroud)

例2

替换字符串中出现的所有fishsheep.

String myString = "one fish, two fish, three fish";

String target = "fish";
String replacement = "sheep";

String newString = myString.replace(target, replacement);
// one sheep, two sheep, three sheep
Run Code Online (Sandbox Code Playgroud)

replaceAll()

使用replaceAll(),如果你想使用正则表达式模式.

例3

用一个替换任何数字x.

String myString = "__1_6____3__6_345____0";

String regex = "\\d";
String replacement = "x";

String newString = myString.replaceAll(regex, replacement); 
// __x_x____x__x_xxx____x
Run Code Online (Sandbox Code Playgroud)

例4

删除所有空格.

String myString = "   Horse         Cow\n\n   \r Camel \t\t Sheep \n Goat        ";

String regex = "\\s";
String replacement = "";

String newString = myString.replaceAll(regex, replacement); 
// HorseCowCamelSheepGoat
Run Code Online (Sandbox Code Playgroud)

也可以看看

文档

常用表达


Aar*_*rya 5

  1. replace() 和 replaceAll() 都接受两个参数,并用第二个子字符串(第二个参数)替换字符串中所有出现的第一个子字符串(第一个参数)。
  2. replace() 接受一对字符或字符序列,而 replaceAll() 接受一对正则表达式。
  3. replace() 的工作速度比 replaceAll() 快,这是不正确的,因为两者在其实现中使用相同的代码

    Pattern.compile(regex).matcher(this).replaceAll(replacement);

现在的问题是何时使用 replace 以及何时使用 replaceAll()。当您想用另一个子字符串替换一个子字符串而不管它在字符串中出现的位置时,请使用 replace()。但是如果你有一些特殊的偏好或条件,比如只替换字符串开头或结尾的那些子字符串,请使用 replaceAll()。下面是一些例子来证明我的观点:

String str = new String("==qwerty==").replaceAll("^==", "?"); \\str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); \\str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); \\str: "?qwerty?"
Run Code Online (Sandbox Code Playgroud)

  • 它们不是完全相同的实现。`replace` 不会调用 `Pattern.compile(regex).matcher(this).replaceAll(replacement);`。它调用`Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));` (4认同)
  • _replaceAll() 接受一对正则表达式_ 为什么搜索字符串 ** 和替换字符串 ** 都是正则表达式?事件会被替换成什么?用正则表达式?当然,只有第一个参数是正则表达式(搜索字符串)。第二个不是正则表达式(替换字符串)。 (2认同)