Java使用确切的字符数替换String中的子字符串

时间:2016-02-01 21:00:32

标签: java regex

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

我的代码

ordered

但它用1 *代替测试。

5 个答案:

答案 0 :(得分:3)

如果单词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借用,请参见其他选项)SO帖子是:

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

答案 1 :(得分:0)

是的,因为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", '*');

答案 2 :(得分:0)

如果您要替换任意文本,并且想要使用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 :(得分:0)

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

我很抱歉在问题中不清楚,如果我不是。

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_
_*********_

答案 4 :(得分:-1)

实际上你 非常接近 你想要的东西。这就是你能做的:

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

<强>输出:

_****_
h***o