【问题标题】:Mask String with characters带字符的掩码字符串
【发布时间】:2012-08-27 19:25:36
【问题描述】:

嘿,伙计,我试图找到一种隐藏字符串的方法,但我发现的代码只适用于我的应用程序...有没有办法用*- 隐藏字符串中的字符如果有人可以解释一下

【问题讨论】:

  • “隐藏字符串”是什么意思?您不能只显示与原始长度相同的“”字符串吗?您只想隐藏 *一些 字符吗?反对模式?长度?
  • 是的,正如 Dave Newton 所说,有一些方法可以用你喜欢的任何方式替换部分字符串或整个字符串,但你必须更具体地了解你想要的结果。你能给我们一个具体的例子来显示原始字符串,以及你希望它如何照顾你的“替换”。
  • 我考虑过替换字符选项,但我意识到如果有两个相同的字符我会卡住。基本上我要解释的是刽子手的概念,一行-----代表单词
  • 你想保留什么,你想变成什么 * 以下选项:字符、数字、空格、制表符、只是字母,诸如#$%^&@

标签: java


【解决方案1】:

这是用来设置密码的吗?考虑以下几点:

class Password {
    final String password; // the string to mask
    Password(String password) { this.password = password; } // needs null protection
    // allow this to be equal to any string
    // reconsider this approach if adding it to a map or something?
    public boolean equals(Object o) {
        return password.equals(o);
    }
    // we don't need anything special that the string doesnt
    public int hashCode() { return password.hashCode(); }
    // send stars if anyone asks to see the string - consider sending just
    // "******" instead of the length, that way you don't reveal the password's length
    // which might be protected information
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; < password.length(); i++) 
            sb.append("*");
        return sb.toString();
    }
}

或者对于刽子手的方法

class Hangman {
    final String word;
    final BitSet revealed;
    public Hangman(String word) {
        this.word = word;
        this.revealed = new BitSet(word.length());
        reveal(' ');
        reveal('-');
    }
    public void reveal(char c) {
        for(int i = 0; i < word.length; i++) {
            if(word.charAt(i) == c) revealed.set(i);
        }
    }
    public boolean solve(String guess) {
        return word.equals(guess);
    }
    public String toString() {
         StringBuilder sb = new StringBuilder(word.length());
         for(int i = 0; i < word.length; i++) {
             char c = revealed.isSet(i) ? word.charAt(i) : "*";
         }
         return sb.toString();
    }
}

【讨论】:

    【解决方案2】:

    只需创建一个与原始字符数相同的字符串,而是使用您的“混淆”字符。

    String x = "ABCD";
    
    String output = "";
    for (int i = 0; i < x.length(); i++) {
        output += "*";
    }
    

    您也可以使用x.replaceAll("\\S", "*"),这样也可以保留空格。

    【讨论】:

    • 您需要检查所有空白和非空白字符。所以正则表达式是[\s\S]
    • @mrres1 不,我特别说过将replaceAll 与我提到的模式一起使用“会保留空白”。也就是说,只会用星号替换非空白字符。所以“hello world”会变成“***** *****”。您提供的正则表达式不会保留空格。
    • 问题是“有没有办法用“*”或“-”隐藏字符串中的字符,如果有人可以解释一下”
    • 这就是为什么 replaceAll 被建议为 alternative 的原因,如果需要,它会保留空白。之前的 for 循环将替换所有字符。
    • 仅当自 OP 说“有没有办法用“*” 或“-”隐藏字符串中的字符时,英语语言发生了显着变化? . for 循环遍历字符串并将每个字符替换为 '*'。
    【解决方案3】:

    有几种方法可以实现这一点,这取决于您的应用程序。

    如果您想一举用另一个字符掩盖所有字符,您可以使用String#replaceAll(String regex, String replacement) 方法:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replaceAll(java.lang.String,%20java.lang.String)

    这涉及使用正则表达式,对于regex,您将使用[\s\S],它将匹配任何空白或非空白字符。对于replacement,您使用常规字符串,而不是正则表达式。在这种情况下,如果你想要一个星号,使用“*”,连字符“-”,很简单。

    除了@Roddy of the Frozen Pea@djc391 之外,这里的所有其他方法都运行良好,所以这就是我正确回答的原因。

    祝你好运

    【讨论】:

      【解决方案4】:

      你可以很容易地实现这样的东西:

      public class MaskedString
      {
          private String data;
      
          public MaskedString(String data){this.data = data;}
          public void append(char c){data += c;}
          public void setData(String data){this.data = data;}
      
          public String getMasked()
          {
              StringBuilder sb = new StringBuilder();
              for(int i=0; i<data.length(); i++)
                  sb.append('*');
              return sb.toString();
          }
      
          public String getString()
          {
              return data;
          }
      }
      

      你明白了:)

      【讨论】:

        【解决方案5】:

        我的实现:

        public static String maskString(String s, int x) {
            int n = s.length()/x;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < s.length(); i++) {
              if (n >= 1 && (i < n || i >= (s.length() - n))) {
                sb.append(s.charAt(i));
              }
              else {
                sb.append("*");
              }
            }
            return sb.toString();
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-23
          • 2013-08-29
          • 2022-01-19
          • 2020-07-08
          • 2017-11-04
          • 2020-04-11
          • 1970-01-01
          相关资源
          最近更新 更多