【问题标题】:String.replaceAll without RegEx没有 RegEx 的 String.replaceAll
【发布时间】:2010-11-30 17:42:49
【问题描述】:

我想替换字符串中子字符串的所有实例,但String.replaceAll() 只接受一个模式。我来自上一场比赛的字符串。是否可以向我拥有的模式添加转义,或者在另一个接受文字字符串而不是模式的类中是否有 replaceAll() 的版本?

【问题讨论】:

标签: java


【解决方案1】:

只需使用String.replace(CharSequence,CharSequence) 而不是replaceAll

注意:replace 不只是替换第一次出现,它会替换所有次出现,例如 replaceAll

【讨论】:

  • 这不只是替换第一个吗?奇怪的是他们称之为“replaceAll”而不是“replaceRegex”。
  • System.out.println("hello world, hello life, hello you".replace("hello","hi")); 返回"hi world, hi life, hi you"
  • @MagicOctopusUrn:是的,我同意它的命名很糟糕——随着时间的推移它引起了很多混乱。
  • 非常糟糕的方法命名。为什么他们(sun/oracle)让简单的事情变得复杂
  • 我认为replaceAll(正则表达式方法)的命名是为了区别于replaceFirst(正则表达式方法),而不是与replace(非正则表达式方法)区别开来。
【解决方案2】:

添加转义的方法是Pattern.quote()

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

但正如 Jon 所说,您可以使用 replace()。尽管它偏离了 replaceAll 名称,但它确实替换了 所有 项,就像 replaceAll() 一样。

【讨论】:

  • 例如,如果您的 matchingStr 中有“$”,则可以完美运行。
  • 相当 Pattern.compile(); Pattern.quote() 带来不良结果
  • @PavloZvarych:Pattern.compile() 将字符串编译为正则表达式,这意味着特殊字符将被赋予特殊含义。这与 Pattern.quote() 所做的完全相反,以及 OP 的要求(quote() 说,“将字符串视为文字”)。也许您可以扩展您所说的“不良结果”。
  • @MarkPeters 类似于 \\G1\\G for "$1"
  • @PavloZvarych:如果你想引用替换(而不是搜索模式),你想使用Matcher.quoteReplacement("$aa +")Pattern.compile() 产生 Pattern,而不是 String,所以我不清楚你是如何在 replaceAll 中使用它的。
猜你喜欢
  • 2018-07-13
  • 2012-01-26
  • 2013-05-30
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多