【问题标题】:String replace with condition not be a subpart of word Java字符串替换条件不是 Java 的子部分
【发布时间】:2016-06-27 15:48:10
【问题描述】:

字符串替换更改更多我想要的。 例如

String input = "The blue house Theatres";
input = input.replace("the", "AAA");

输出它将是:

 "AAA blue house AAAatres"

我不想改变什么时候是一个词的子部分。

【问题讨论】:

  • 你是说它取代了忽略大小写
  • 如果我理解你的话,你只想在独立词而不是词的一部分时替换它?
  • 是的,当前后有字符时忽略大小写
  • 尝试在你的表达中使用单词边界\b,例如\bthe\b - 如果您想忽略大小写,请在前面添加 (?i)。哦,使用replaceAll()...
  • @sinclair 我没有投反对票,所以我不得不猜测,但即使是一个完全合理的问题也可能显示出一些缺乏努力,例如没有显示已经尝试过的内容以及失败的地方,OP是否尝试使用搜索引擎首先找到一些帮助,缺少或很少的示例等 - 但我和你在一起,至少应该支持一个反对票发表评论,以帮助发布者从其他人的想法中吸取教训。

标签: java string replace conditional-statements


【解决方案1】:

首先您应该尝试使用replaceAll(regex, replacement) 而不是replace(literal, replacement),因为后者仅适用于文字,即您不能使用表达式,而前者使用正则表达式来查找匹配项。

接下来,您的正则表达式应该使用单词边界,例如\bthe\b 其中\b 标记单词边界。

最后,如果您想进行不区分大小写的替换,您需要处理 epxression 中可能出现的情况(例如 \b[tT]he\b),或者通过在表达式前面加上 (?i) 将表达式切换到不区分大小写模式,即(?i)\bthe\b。请注意,表达式[tT]he匹配THE,而不区分大小写的表达式会,因此根据您的要求,您需要选择其中一个。

使用所有你会得到的input = input.replaceAll("(?i)\\bthe\\b", "AAA");

编辑

根据您对问题的评论,您不想使用单词边界,而只想查找前后的字符。您可以通过消极的环顾表达来实现这一点,
例如(?i)(?<![a-z])the(?![a-z])。请注意,我在这里使用了非常简单的字符类[a-z],如果您需要排除更多字符,则需要对其进行扩展。

上述表达式将匹配 !ThetheTHE? 等,但不匹配 Theatreaether 等,因为 if 要求匹配 not 前面有字符 ((?<![a-z])) 而不是后跟一个
((?![a-z]))。

【讨论】:

  • 非常彻底的答案。
  • @NahuelBrandan 不客气。顺便说一句,在这里查看更多关于正则表达式的信息:regular-expressions.info
【解决方案2】:

使用带有word boundaries \b 的正则表达式:

String input = "The blue house Theatres";
input.replaceAll("\\bThe\\b", "AAA");

【讨论】:

  • replaceAll() not replace() 因为后者不使用正则表达式。
  • 不考虑前后有特殊字符的情况,只有用空格隔开的情况。
  • 您的答案的主要部分看起来不错,但是您忘记了字符串是不可变的,因此方法(包括替换)不能影响原始字符串,但它们会创建新字符串。您需要将该新字符串存储在某处(即使与 input = input.replace...) 等原始字符串的引用相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2016-04-02
  • 2021-11-05
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多