【问题标题】:How to replace all chars in the string except another string in this string如何替换字符串中除此字符串中的另一个字符串之外的所有字符
【发布时间】:2013-05-22 09:36:24
【问题描述】:

例如我有两个字符串

String a="aaabbbaaa";
String b="bbb";

我需要替换字符串 a 中除字符串 b 之外的所有字符

我需要下一个结果(例如,我们将所有“a”字符替换为“+”): +++bbb+++

【问题讨论】:

  • 去,学习,尝试然后提问。
  • 字符串 a 可以包含 any 字符还是只有一个其他字符?
  • 你了解过正则表达式吗?你能先试试看然后回来寻求帮助吗...

标签: java string


【解决方案1】:
String a="aaabbbaaa";
String b="bbb";


String newA = "";
int i = 0;
while (i < a.indexOf(b)) {
  newA += "+";
  i++;
}

newA +=b;

i = a.lastIndexOf(b);
while (i < a.length()) {
  newA += "+";
  i++;
}
System.out.println(newA);

【讨论】:

  • +1 表示 最简单 解决方案,但 i=...; while(i...){...;i++;} 可以写成 for(i=...;i...;i++){...}。请注意,您也没有来创建新字符串。
  • 你应该使用a.indexOf(b) + b.length()而不是a.lastIndexOf(b)
【解决方案2】:

为此,我总是使用外部库:Apache-Commons-Lang。在这个包中,您有大量经过良好测试和精心设计的字符串操作方法。

  • StringUtils.replace(null, *, *) = null
  • StringUtils.replace("", *, *) = ""
  • StringUtils.replace("any", null, *) = "any"
  • StringUtils.replace("any", *, null) = "any"
  • StringUtils.replace("any", "", *) = "any"
  • StringUtils.replace("aba", "a", null) = "aba"
  • StringUtils.replace("aba", "a", "") = "b"
  • StringUtils.replace("aba", "a", "z") = "zbz"

【讨论】:

    【解决方案3】:

    来自@Shreyas Dave的非常简单的解决方案的改进版:

    String myReplace(String a, String b, char substitute) {
        final StringBuilder result = new StringBuilder(a.length());
        int i = 0;
        int pos = -1;
        while ((pos = a.indexOf(b, pos + 1)) >= 0) {
            for (; i < pos; ++i) { 
                result.append(substitute);         
            }
            result.append(b);
            i += b.length();
        }
        for (; i < a.length(); ++i) { 
            result.append(substitute);         
        }
        return result.toString();
    }
    

    【讨论】:

    • 当然,它只适用于第一次出现。 b 可以在 a 中多次出现这一事实应在 OP 中予以澄清。
    • @AdamStelmaszczyk 这是一个处理字符串多次出现的新版本。
    【解决方案4】:

    至少这是可行的:

        String a = "axabbbababbbbbbbbb";
        String b = "bbb";
        StringBuilder result = new StringBuilder(a.length());
        for (int i = 0, alen = a.length(), blen = b.length(), last = alen - blen + 1; i < alen; i++) {
            if (i < last && b.equals(a.substring(i, i + blen))) {
                result.append(b);
                i += blen - 1;
            }
            else {
                result.append('+');
            }
        }
        System.out.println(result);
    

    【讨论】:

      【解决方案5】:

      使用正则表达式,您可以执行以下操作:

      public static String plussify(String data, String words) {
          return (" " + data).replaceAll(".((?:"+words+")+)?", "+$1").substring(1);
      }
      

      需要添加空格前缀来满足字符串以不被替换的单词开头的极端情况。如果这永远不会发生,那么您只需要replaceAllwords 字符串在正则表达式中使用,因此需要相应地进行转义和清理。 words 的语法是 bbb 用于单个字符串或 bbb|d|ff 用于多个字符串(bbbdff)。

      正则表达式的工作原理是使用单个字符并将它们替换为 +,如果任何字符后面跟着一个列入白名单的单词,那么该单词也会被使用(从而阻止它被 + 替换)并附加到+ 代替白名单单词前面的字符。

      示例:

      System.out.println(plussify("daaabbbffffbbabbd","bbb|d|ff"));
      
      output: d+++bbbffff+++++d
      


      鉴于我们知道该字符串不以任何列入白名单的单词开头:

      System.out.println("aaabbbaaa".replaceAll(".((?:bbb)+)?", "+$1"));
      output: +++bbb+++
      

      【讨论】:

        猜你喜欢
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        相关资源
        最近更新 更多