【问题标题】:Java replace a string with certain characters to hide the string?Java用某些字符替换字符串以隐藏字符串?
【发布时间】:2013-07-09 03:55:14
【问题描述】:

好的,我想用特定输入替换用户返回的字符串。我想用'?'替换字符串中的每个小写字母,但不是空格!插入'?'的地方should go 在 print 语句中,末尾带有随机空格(“”)。谢谢您的帮助。

import java.util.Scanner;
public class Program05 {

    public static void main(String[] args) 

    {
    Scanner scanner01 = new Scanner(System.in);
    String inputPhrase; 


        do {
            System.out.print("Enter a common phrase to begin!: ");
            inputPhrase = scanner01.nextLine(); 

        }  while (!inputPhrase.matches("[a-z ]+"));

        System.out.print("Press [ENTER] to continue...");  
            try  
            {  
              System.in.read();  
              System.in.skip(System.in.available()); 
            } catch(Exception e){e.printStackTrace();} //though that was a neat little touch 


         do {

            boolean valid = true;


            for (int i = 0; i < inputPhrase.length(); i++)
                {

                 System.out.println("Common Phrase\n-------------" + "\n" + " " );  


                    }






            //System.out.print(inputPhrase);



         } while (!inputPhrase.matches("[a-z ]+"));

    }

}

【问题讨论】:

  • AFAIK 使用Scanner 或简单的阅读器是不可能的。从 Java 6 开始,您可以使用 Console#readPassword 来满足您的需求。
  • 不要抓到Exception!捕获实际的异常类型,如果您真的不想处理它,请将其包装在 RuntimeException 中并重新抛出它,而不是打印堆栈跟踪。以后你会省去一些调试上的麻烦。

标签: java string character replace


【解决方案1】:

假设你的字符串在变量 s 中。然后你可以逐个字母循环使用

for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
}

所以这归结为检查 char c 是否为小写,并采取相应措施。确定 char c 是否为小写的一种可能方法是检查其 int 值并查看其是否介于 97 和 122 之间。

int intValue = (int) c;
if (intValue >= 97 && intValue <= 122) { }

如果是,则将其替换为问号。

一个简单的方法是创建一个临时字符串,当你循环访问源字符串时,添加每个字母直到你得到小写字母,在这种情况下你添加一个问号直到你完成。

【讨论】:

  • 哦,但是我的代码只允许在字符串中输入小写字符。因此,如果输入其他任何内容,它会重新提示。对不起,我没有澄清。
  • !inputPhrase.matches("[a-z ]+")
  • 恐怕我误会了你。你能举几个例子来说明字符串替换应该实现什么吗?例如,对于输入“xyz”,你想要什么,等等?我认为我上面的回答不适用于您实际尝试做的事情。如果您愿意,您也可以编辑您的原始问题,也可以添加这些新信息。
【解决方案2】:

您可以简单地利用 API 中内置的正则表达式功能,例如...

String question = "This is a Test String".replaceAll("([a-z])", "?");
System.out.println(question);

会输出...

T??? ?? ? T??? S?????

nb [a-z] 给出相同的结果

【讨论】:

    【解决方案3】:

    您可以将replaceAll 与正则表达式\p{Lower} 结合使用:

    String str = "Hello World";
    System.out.println(str.replaceAll("\\p{Lower}", "?"));
    
    H????哇???

    【讨论】:

    • 那我们怎样才能找回原文
    【解决方案4】:

    在大多数情况下,我们希望隐藏我们的个人详细信息,例如电话号码、电子邮件等。这里我假设您要隐藏电子邮件或电话号码中的字符。

    假设CredentialModel 是一个看起来像这样的类:

    public class CredentialModel {
        private String username;
        private String phoneno;
        private String email;
    
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPhoneno() {
            return phoneno;
        }
        public void setPhoneno(String phoneno) {
            this.phoneno = phoneno;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        @Override
        public String toString() {
            return "CredentialModel [username=" + username + ", phoneno=" + phoneno + ", email=" + email + "]";
        }
    }
    

    加密方式如下:

    public CredentialModel encryptPrivateDetails(CredentialModel credentialModel) {
        String phoneno = credentialModel.getPhoneno();
        String email = credentialModel.getEmail().split("\\@")[0];
        String domain = credentialModel.getEmail().split("\\@")[1];
        if (phoneno != null) {
            int minlength = 9;
            int blocklength = 5;
            if (phoneno.length() > blocklength) {
                if (phoneno.length() > minlength) {
                    int visibleStartLength = 3;
                    credentialModel.setPhoneno(phoneno.substring(0, visibleStartLength)
                            + String.format("%" + blocklength + "s", "").replace(' ', 'x')
                            + phoneno.substring(visibleStartLength + blocklength));
                } else
                    credentialModel.setPhoneno(String.format("%" + blocklength + "s", "").replace(' ', 'x')
                            + phoneno.substring(blocklength));
            }
        }
        if (email != null) {
            int minlength = 2;
            if (email.length() > minlength)
                credentialModel.setEmail(email.substring(0, minlength)
                        + String.format("%" + (email.length() - minlength + 1) + "s", "@").replace(' ', 'x') + domain);
            else
                credentialModel.setEmail(String.format("%" + (email.length() + 1) + "s", "@").replace(' ', 'x') + domain);
        }
        return credentialModel;
    }
    

    请根据您的要求进行调整。

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 2012-03-30
      • 2018-10-19
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多