簡體   English   中英

Java用確切的字符數替換字符串中的子字符串

[英]Java Replace substring in String with exact number of character

我的字符串是“ test ”,“ test”有4個字符,我想用“ ****”替換“ test”,所以我得到“ ****

我的密碼

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

但是它將測試替換為1 *。

如果單詞test只是一個示例,則可以使用Matcher.appendReplacement (有關此技術的更多詳細信息,請參見如何在Matcher組上而不是整個模式上添加 Matcher.appendReplacement ):

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功能(從簡單方法借用重復Java中的String ,請參見那里的其他選項)因此發布:

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演示

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

如果您要替換任意文本,並且要使用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

所以我得到了答案,我真的在尋找盡可能少的行。 謝謝大家的回答,但這是我發現最有用的答案。

如果不是這樣,我很抱歉在這個問題上不清楚。

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

實際上,您已經非常接近所需的內容。 您可以執行以下操作:

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

輸出:

_****_
h***o

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM