使用正则表达式替换子字符串

时间:2013-10-18 02:58:17

标签: java

所以我一直在尝试制作这个简单的加密程序,但我似乎无法弄清楚一些事情。我需要输入的短语是

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;
}
}

4 个答案:

答案 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

但这仅适用于这一句话。


你能做什么:

  1. 创建要替换的所有字符的地图,然后替换。
  2. 创建要在原始字符串上替换的每个字符的索引列表。
  3. 颠倒列表的顺序(从最高到最低)
  4. 从列表中的第一个索引开始(要替换的最后一个字符)将该索引处的字符替换为地图中的替换字符
  5. 重复4向后工作。

答案 2 :(得分:0)

首先,您应该使用replace(),而不是replaceAll()。两者都替换了找到的所有匹配项,但replaceAll()使用正则表达式匹配,而replace()使用纯文本。

接下来,您的替换方式会相互妨碍,因此请使用StringBuffer并从第八个开始向后工作,一次替换一个字符。

解密同样应该从左边开始一次处理一个字符。

答案 3 :(得分:0)

正如其他人已经告诉过你的问题是你在几次迭代中替换字符(replaceAll调用)而不是一次。如果您想要阻止替换用于替换其他字符的字符,则可以使用appendReplacement类中的appendTailMatcher

以下是如何做到这一点

// 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.

瞧。