【问题标题】:Replacing a word in string while preserving original word's case在保留原始单词大小写的同时替换字符串中的单词
【发布时间】:2017-03-11 19:17:32
【问题描述】:

什么是正确的方法 - 最佳实践 - 用另一个替换字符串中的单词(字符序列),但保留原始的大小写?具体来说,如果原文全大写,替换词也应该是大写。如果原文全是小写,替换词也应该是小写。如果原文以大写字符开头,其余为小写,则替换词也应为小写。

我目前通过三个条件检查来实现这一点,这对我的目的来说很好。但在我看来,必须有一个更好的“最佳实践”方式,可能但不一定,使用正则表达式。这旨在讨论可能的最佳或更好的实践,以启发现有的最佳实践,而不是请求解决已经解决和实施的琐碎编码问题。

一个具体的例子。在一个可以在多个平台上运行的应用程序中,所有包含“click”的字符串在移动设备上运行时都会被翻译成“tap”,就像“Click”变成“Tap”,“CLICK”变成“TAP”一样。在我自己的例子中,我用一种更通用的方式来做这件事,使用一个单词图及其替换,但这是一个具体的例子。

【问题讨论】:

标签: java


【解决方案1】:

给定target 子字符串:

  • 创建一个StringBuilder

  • 逐个字符地并行循环遍历targetreplacement 字符串。

  • 在每次迭代中,检查target 字符的大小写。

  • StringBuilder 中添加对应的replacement 字符,改为这种情况。

  • 退出循环后,在原始字符串中使用StringBuildertoString 执行target 的标准replaceAll

targetreplacementnull、为空或长度不同,根据需要调整上述内容。

【讨论】:

    【解决方案2】:

    如果不强制使用正则表达式,您可以通过以下方式(在一行中):

    s1 = s1.replace(s2, s3.chars().mapToObj(i -> Character.isUpperCase(s2.charAt(s3.indexOf((char)i))) ? Character.toString(Character.toUpperCase((char)i)) : Character.toString(Character.toLowerCase((char)i))).collect(Collectors.joining()));
    

    这里s1是原始字符串,s2是要替换的字符串,s3是替换s2的新字符串,保持s2的大小写。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 2018-05-27
      • 2018-08-06
      • 2022-01-03
      • 2021-03-29
      • 1970-01-01
      • 2014-05-29
      • 2016-11-24
      • 1970-01-01
      相关资源
      最近更新 更多