【问题标题】:How to replace all characters in a Java string with stars如何用星号替换Java字符串中的所有字符
【发布时间】:2011-11-11 05:07:19
【问题描述】:

我想用* 字符替换Java 字符串中的所有字符。所以不管它是什么字符,它应该被替换为*

我知道互联网上有大量示例,但没有一个可以替换每个字符,我自己尝试过但没有成功。

【问题讨论】:

  • 每个字符包括空格?

标签: java regex


【解决方案1】:

Java 11 及更高版本

str = "*".repeat(str.length());

注意:这会将换行符 \n 替换为 *。如果您想保留\n,请参阅下面的解决方案。

Java 10 及更早版本

str = str.replaceAll(".", "*");

保留换行符。

要在 Java 10 及更早版本中用 * 替换换行符,您可以使用:

str = str.replaceAll("(?s).", "*");

(?s) 不匹配任何内容,但会激活 DOTALL 模式,这使得 . 也匹配 \n

【讨论】:

  • 请注意,由于 squid:S2639,Sonar 将使用 Java 10 及更早的解决方案发出警告。而是使用 Guava 或 Commons-lang 解决方案,如其他解决方案中所述。
  • “不要使用.作为正则表达式,因为你可能有别的意思”? (source) 如果你问我,那就太可笑了。
  • 嘿,我只是信使?。另一方面,如果长度相同,则匹配所有内容以获得屏蔽字符串可以说是一种不常见的用法和次优解决方案。
  • 取决于你优化的目的。如果您追求简洁和可读性,我会说这是最好的解决方案。
【解决方案2】:

完全不要使用正则表达式,计算字符串长度,并返回相应的星数。

纯 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, '*');

使用Commons / Lang

return StringUtils.repeat("*", str.length());

【讨论】:

  • 我认为应该是“你根本不需要正则表达式”而不是“根本不要使用正则表达式”。后者表明正则表达式是错误的解决方案。
  • @taurelas 对于这个问题,这是错误的解决方案。这个问题只需要字符串的长度。
  • 从 Java 11 开始,String 类中有一个 repeat 方法,所以这将是 "*".repeat(str.length()),不需要任何非 JDK 库。
【解决方案3】:
System.out.println("foobar".replaceAll(".", "*"));

【讨论】:

    【解决方案4】:
    public String allStar(String s) {
        StringBuilder sb = new StringBuilder(s.length());
        for (int i = 0; i < s.length(); i++) {
            sb.append('*');
        }
        return sb.toString();
    }
    

    【讨论】:

      【解决方案5】:

      如何创建一个新字符串,其中 * 的数量 = 最后一个字符串 char 的数量?

      StringBuffer bf = new StringBuffer();
      for (int i = 0; i < source.length(); i++ ) {
          bf.append('*');
      }
      

      【讨论】:

        【解决方案6】:

        可能还有其他更快/更好的方法可以做到这一点,但您可以只使用字符串缓冲区和 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);
        }
        

        【讨论】:

          【解决方案7】:

          没有任何外部库,也没有你自己的循环,你可以这样做:

          String input = "Hello";
          char[] ca = new char[input.length()];
          Arrays.fill(ca, '*');
          String output = new String(ca);
          

          顺便说一句,Arrays.fill()String(char []) 都非常快。

          【讨论】:

            【解决方案8】:

            递归方法

            String nCopies(String s, int n) {
                return n == 1 ? s.replaceFirst(".$", "") : nCopies(s + s, --n);
            }
            

            【讨论】:

              【解决方案9】:
                  String text = "Hello World";
                  System.out.println( text.replaceAll( "[A-Za-z0-9]", "*" ) );
              

              输出:***** *****

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-01-04
                • 1970-01-01
                • 2013-12-31
                • 2016-08-16
                • 2013-06-27
                • 2012-09-05
                • 2018-09-10
                相关资源
                最近更新 更多