【发布时间】:2011-11-11 05:07:19
【问题描述】:
我想用* 字符替换Java 字符串中的所有字符。所以不管它是什么字符,它应该被替换为*。
我知道互联网上有大量示例,但没有一个可以替换每个字符,我自己尝试过但没有成功。
【问题讨论】:
-
每个字符包括空格?
我想用* 字符替换Java 字符串中的所有字符。所以不管它是什么字符,它应该被替换为*。
我知道互联网上有大量示例,但没有一个可以替换每个字符,我自己尝试过但没有成功。
【问题讨论】:
str = "*".repeat(str.length());
注意:这会将换行符 \n 替换为 *。如果您想保留\n,请参阅下面的解决方案。
str = str.replaceAll(".", "*");
这保留换行符。
要在 Java 10 及更早版本中用 * 替换换行符,您可以使用:
str = str.replaceAll("(?s).", "*");
(?s) 不匹配任何内容,但会激活 DOTALL 模式,这使得 . 也匹配 \n。
【讨论】:
.作为正则表达式,因为你可能有别的意思”? (source) 如果你问我,那就太可笑了。
完全不要使用正则表达式,计算字符串长度,并返回相应的星数。
纯 Java
int len = str.length();
StringBuilder sb = new StringBuilder(len);
for(int i = =; i < len; i++){
sb.append('*');
}
return sb.toString();
普通 Java >= 8 版本:
int len = str.length();
return IntStream.range(0, n).mapToObj(i -> "*").collect(Collectors.joining());
使用Guava:
return Strings.repeat("*", str.length());
// OR
return CharMatcher.ANY.replaceFrom(str, '*');
return StringUtils.repeat("*", str.length());
【讨论】:
String 类中有一个 repeat 方法,所以这将是 "*".repeat(str.length()),不需要任何非 JDK 库。
System.out.println("foobar".replaceAll(".", "*"));
【讨论】:
public String allStar(String s) {
StringBuilder sb = new StringBuilder(s.length());
for (int i = 0; i < s.length(); i++) {
sb.append('*');
}
return sb.toString();
}
【讨论】:
如何创建一个新字符串,其中 * 的数量 = 最后一个字符串 char 的数量?
StringBuffer bf = new StringBuffer();
for (int i = 0; i < source.length(); i++ ) {
bf.append('*');
}
【讨论】:
可能还有其他更快/更好的方法可以做到这一点,但您可以只使用字符串缓冲区和 for 循环:
public String stringToAsterisk(String input) {
if (input == null) return "";
StringBuffer sb = new StringBuffer();
for (int x = 0; x < input.length(); x++) {
sb.append("*");
}
return sb.toString();
}
如果您的应用程序是单线程的,您可以改用 StringBuilder,但它不是线程安全的。
我不确定这是否会更快:
public String stringToAsterisk(String input) {
if (input == null) return "";
int length = input.length();
char[] chars = new char[length];
while (length > 0) chars[--length] = "*";
return new String(chars);
}
【讨论】:
没有任何外部库,也没有你自己的循环,你可以这样做:
String input = "Hello";
char[] ca = new char[input.length()];
Arrays.fill(ca, '*');
String output = new String(ca);
顺便说一句,Arrays.fill() 和 String(char []) 都非常快。
【讨论】:
String nCopies(String s, int n) {
return n == 1 ? s.replaceFirst(".$", "") : nCopies(s + s, --n);
}
【讨论】:
String text = "Hello World";
System.out.println( text.replaceAll( "[A-Za-z0-9]", "*" ) );
输出:***** *****
【讨论】: