【问题标题】:Filter bad words | java 'replace'过滤坏词 | java'替换'
【发布时间】:2013-04-19 09:27:34
【问题描述】:

为了过滤坏词,我发现java中的'replace'函数并不像预期的那么方便。 请在下面找到代码: 例如:考虑单词“abcde”,我想将其过滤为“a***e”。

    String test = "abcde";
    for (int i = 1; i < sdf.length() - 1; i++) {
        test= test.replace(test.charAt(i), '*');
    }
    System.out.print(test);

输出:a***e

但如果字符串为String test = "bbcde";,则输出为****e。看来,如果单词有重复的字母(如这里),replace 函数会替换重复的字母 也。 为什么会这样?我想过滤不包括第一个和最后一个字母的单词。

【问题讨论】:

  • 你想从另一个文本中过滤掉坏词,让“abcde”成为一个坏词,必须过滤掉吗?还是您只想从输入“abcde”中获取“ae”,从“bbcde”中获取“be”?
  • 我想从 abcde 得到一个 ***e!得到了答案。非常感谢

标签: java filter replace


【解决方案1】:

这是因为String.replace(char, char) 替换了所有 次出现的第一个字符(根据其Javadoc)。

你想要的可能更像这样:

char[] word = test.toCharArray();
for (int i = 1; i < word.lengh - 1; i++) { // make sure to start at second char, and end at one-but-last char
    word[i] = '*';
}
System.out.println(String.copyValueOf(word));

【讨论】:

    【解决方案2】:

    由于String.replace(char, char) 替换了所有出现的指定字符,这将是满足您要求的更好方法:

    String test = "abcde";
    String replacement = "";
    for (int i = 0; i < sdf.length(); i++) {
        replacement += "*";
    }
    test= test.replace(sdf, replacement );
    System.out.print(test);
    

    【讨论】:

      【解决方案3】:

      看来,如果单词有重复的字母(如这里),replace 函数也会替换重复的字母。为什么会这样?

      为什么?因为这就是它的工作原理,正如String.replace(char oldChar, char newChar) 的 API 文档所说:

      返回一个新字符串,该字符串是用newChar替换此字符串中所有出现的oldChar

      如果你只是想用第一个字母,一些星号和最后一个字母替换字符串的内容,那么你根本不需要使用replace

      String test = "abcde";
      
      if (test.length() >= 1) {
          StringBuilder result = new StringBuilder();
          result.append(test.charAt(0));
          for (int i = 0; i < test.length() - 2; ++i) {
              result.append('*');
          }
          result.append(test.charAt(test.length() - 1));
          test = result.toString();
      }
      
      System.out.println(test);
      

      【讨论】:

        【解决方案4】:
        public static void main(String[] args) {
        
            String test = "bbcde";
            String output = String.valueOf(test.charAt(0));
            for (int i = 1; i < test.length() - 1; i++) {
                output = output + "*";
            }
            output = output + String.valueOf(test.charAt(test.length() - 1));
            System.out.print(output);
        }
        

        【讨论】:

          【解决方案5】:

          您应该使用 replaceAll-Function: Link

          有了这个,您可以替换所有在字符串中找到给定子字符串的时间(例如“abcde”)并将所有这些替换为另一个字符串(例如“a***e”)。

          String test = "abcde";
          String replacement = "";
          for (int i = 0; i < test.length(); i++) {
              if (i==0 || i==test.length()-1){
                  replacement += test.charAt(i);
              } else {
                  replacement += "*";
              }
          }
          sdf = sdf.replaceAll(test, replacement);
          System.out.print(test);
          

          【讨论】:

          • 此方法采用正则表达式,它将替换该正则表达式的每个匹配项。所以它的行为可能与你预期的不同......
          • 我想我误解了这个问题?难道他不想在给定文本中找到“abcde”这个词的每一个出现并用“ae”替换它们吗?因此,例如在“blaabcdebla”中,他想收到“blaaebla”?
          • @user2248673 是的,但您可能实际上仍希望使用 replace 而不是 replaceAll。否则,您的“ae”将替换任何 a 和任何 e 之间的任何内容,这绝对不是我们想要的。我们知道“abcde”是一个邪恶的词,但我们也不想审查“alive”(或者就此而言,“ale”和“agriculture”,这两者都会被“ae")。
          猜你喜欢
          • 2019-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多