【问题标题】:Java Replace substring in String with exact number of characterJava用确切的字符数替换String中的子字符串
【发布时间】:2016-05-10 11:25:09
【问题描述】:

我的字符串是“test” “测试”有 4 个字符 我想用“****”替换“测试” 所以我得到“****

我的代码

System.out.println("_test_");
System.out.println("_test_".replaceAll("test", "*"));

但是它将 test 替换为 1 *。

【问题讨论】:

  • replaceAll().中使用[A-Za-z]+而不是test
  • 当然,你特别告诉它用一个*替换test
  • @noob 差不多。 "_test_".replaceAll("[A-Za-z]+", "*") 将用一个* 替换整个test。如果我们想替换每个 single 字符,我们不需要 +.
  • 您要替换的内容之间是否总是有下划线分隔符?例如,"_testing_" 是否有效?
  • 是的,后来我意识到了。

标签: java regex


【解决方案1】:

如果 test 只是一个例子,您可以使用 Matcher.appendReplacement(有关此技术的更多详细信息,请参阅 How to appendReplacement on a Matcher group instead of the whole pattern?):

String fileText = "_test_";
String pattern = "test";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(fileText);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, repeat("*", m.group(0).length()));
}
m.appendTail(sb); // append the rest of the contents
System.out.println(sb);

repeat 函数(借用自Simple way to repeat a String in java,请参阅那里的其他选项)所以帖子是:

public static String repeat(String s, int n) {
    if(s == null) {
        return null;
    }
    final StringBuilder sb = new StringBuilder(s.length() * n);
    for(int i = 0; i < n; i++) {
        sb.append(s);
    }
    return sb.toString();
}

IDEONE demo

【讨论】:

  • 还有StringUtils.repeat 可以提供帮助:-)
  • 这就是为什么我将链接添加到我借用该方法的 SO 问题中。我将这个用于 demo only,因为我不能在 IDEONE 上使用 StringUtils。
【解决方案2】:

如果你要替换任意文本,并且你想使用replaceAll(),请注意它需要一个正则表达式,并且各种字符都有特殊含义。为防止出现问题,请致电Pattern.quote()

另外,要替换为等长的* 序列,您需要构建一个这样的字符串。

这是一个很好的简短方法:

private static String mask(String input, String codeword) {
    char[] buf = new char[codeword.length()];
    Arrays.fill(buf, '*');
    return input.replaceAll(Pattern.quote(codeword), new String(buf));
}

测试

System.out.println(mask("_test_", "test"));
System.out.println(mask("This is his last chance", "is"));

输出

_****_
Th** ** h** last chance

【讨论】:

    【解决方案3】:

    是的,因为replaceAll(str1, str2) 会将所有出现的str1 替换为str2。由于您使用的是文字,因此您需要说

    System.out.println("_test_".replaceAll("test", "****"));
    

    如果你想要自己的替换函数,你可以这样做:

    public static String replaceStringWithChar(String src, String seek, char replacement)
    {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < seek.length(); i++) sb.append(replacement);
        return src.replaceAll(seek, sb.toString());
    }
    

    你可以这样称呼它:

    replaceStringWithChar("_test_", "test", '*');
    

    【讨论】:

    • 这是对问题的误解,OP实际上是在询问任意长度的字符串,他想用星号替换整个单词。 Test 只是一个包含 4 个字母的字符串示例。
    【解决方案4】:

    所以我得到了答案,我真的在寻找 尽可能少的东西。谢谢你们 对于答案,但这是我发现最有用的答案。

    如果我没有明确问题,我很抱歉。

    String str1 = "_AnyString_";
    int start_underscore = str1.indexOf("_");
    int end_underscore = str1.indexOf("_", start_underscore + 1);
    String str_anything = str1.substring(start_underscore + 1, end_underscore);
    String str_replace_asterisk = str_anything.replaceAll(".", "*");
    System.out.println(str_replace_asterisk);
    str1 = str1.replace(str_anything, str_replace_asterisk);
    System.out.println(str1);
    

    输出:

    _AnyString_
    _*********_
    

    【讨论】:

      【解决方案5】:

      其实你是非常接近你想要的。这是你可以做的:

      System.out.println("_test_".replaceAll("[test]", "*"));
      System.out.println("hello".replaceAll("[el]", "*"));
      

      输出:

      _****_
      h***o
      

      【讨论】:

      • 不好,因为"hello".replaceAll("[test]", "*") 会产生h*llo,即使字符串不包含test,也会替换e
      • @Andreas OP 并没有说他想要替换匹配的整个文本序列。
      猜你喜欢
      • 1970-01-01
      • 2015-06-06
      • 2014-12-11
      • 2015-10-20
      • 2013-08-07
      • 2023-03-25
      • 1970-01-01
      • 2013-07-09
      • 2015-05-31
      相关资源
      最近更新 更多