所以我一直在尝试制作这个简单的加密程序,但我似乎无法弄清楚一些事情。我需要输入的短语是
This is a very big morning.
当我输入它时,虽然它返回字符串
This is a ag',rery dug>?/ijeb..w ssadorninjeb..w
相反,我返回
This is a ajedg>P/..w',rery dg>P/ijedg>P/..w ssadorninjedg>P/..w
我不明白为什么以及如何解决它?我已经学习了大约一个月的java,所以我仍然很新鲜,如果有类似的问题已经得到解答请在那里链接我,我将删除这篇文章。
以下是代码:
import static java.lang.System.out;
import java.util.Scanner;
class Encryption {
public static void main(String[] args) {
Scanner userInput = new Scanner(System.in);
Crypto user1 = new Crypto();
out.print("Please enter in a sentence: ");
String user = userInput.nextLine();
user1.encrypt(user);
out.print(user1.getEncrypt());
}
}
public Crypto() { }
public String myEn;
public void encrypt(String Sentence) {
myEn = Sentence.replaceAll("v","ag',r")
.replaceAll("m" , "ssad")
.replaceAll("g" , "jeb..w")
.replaceAll("b" , "dg>P/");
}
public String getEncrypt() {
return myEn;
}
}
答案 0 :(得分:2)
您获得不同输出的原因是链接替换采用先前替换的返回值。因此,在您的情况下,如果有v
,则会更改为ag',r
,其中包含g
。然后,g
会触发replaceAll("g" , "jeb..w")
。
为避免这种情况发生,您应该更改替换顺序:
Sentence.replaceAll("g" , "jeb..w")
.replaceAll("b" , "dg>P/")
.replaceAll("v","ag',r")
.replaceAll("m" , "ssad");
但是,前两个替换语句无法修复,因为一个替换b
的字符串中包含g
,反之亦然,因此您可能需要更改字符你正在替换。
答案 1 :(得分:0)
当您替换g
时,其替换包含b
,那么当您替换b
时,您将获得{{1}中的所有b
替换也被替换了。以及g
的
你能做的是
v
但这仅适用于这一句话。
你能做什么:
答案 2 :(得分:0)
首先,您应该使用replace()
,而不是replaceAll()
。两者都替换了找到的所有匹配项,但replaceAll()使用正则表达式匹配,而replace()使用纯文本。
接下来,您的替换方式会相互妨碍,因此请使用StringBuffer并从第八个开始向后工作,一次替换一个字符。
解密同样应该从左边开始一次处理一个字符。
答案 3 :(得分:0)
正如其他人已经告诉过你的问题是你在几次迭代中替换字符(replaceAll调用)而不是一次。如果您想要阻止替换用于替换其他字符的字符,则可以使用appendReplacement
类中的appendTail
和Matcher
。
以下是如何做到这一点
// We need to store somewhere info about original and its replacement
// so we will use Map
Map<String, String> replacements = new HashMap<>();
replacements.put("v", "ag',r");
replacements.put("m", "ssad");
replacements.put("g", "jeb..w");
replacements.put("b", "dg>P/");
// we need to create pattern which will find characters we want to replace
Pattern pattern = Pattern.compile("[vmgb]");//this will do
Matcher matcher = pattern.matcher("This is a very big morning.");
StringBuffer sb = new StringBuffer();// this will be used to create
// string with replaced characters
// lets start replacing process
while (matcher.find()) {//first we need to find our characters
// then pick from map its replacement
String replacement = replacements.get(matcher.group());
// and pass it to appendReplacement method
matcher.appendReplacement(sb, replacement);
// we repeat this process until original string has no more
// characters to replace
}
//after all we need to append to StringBuffer part after last replacement
matcher.appendTail(sb);
System.out.println(sb);
输出:
This is a ag',rery dg>P/ijeb..w ssadorninjeb..w.
瞧。