在Java中从字符串中删除模式

时间:2017-07-21 00:05:48

标签: java regex

我目前正在开发一种工具,可以帮助我分析不断增长的String,它看起来像这样:String s = "AAAAAAABBCCCDDABQ"。我想要做的是找到A和B的序列,做一些事情,然后从原始String中删除该序列。

我的代码如下所示:

while (someBoolean){

    if(Pattern.matches("A+B+", s)) {
        //Do stuff
        //Remove the found pattern
    }

    if(Pattern.matches("C+D+", s)) {
        //Do other stuff
        //Remove the found pattern
    }

}
return s;

另外,我如何删除三个序列,以便s在计算结束时只包含"Q",而没有无限循环?

3 个答案:

答案 0 :(得分:4)

您应该使用正则表达式替换循环,即方法appendReplacement(StringBuffer sb, String replacement)appendTail(StringBuffer sb)

要查找多种模式中的一种,请使用| regex matcher,并分别捕获每种模式。

然后,您可以使用group(int group)获取每个捕获组的匹配字符串(第一组是组1),如果该组不匹配,则返回null。为了获得更好的性能,只需检查该组是否匹配,请使用start(int group),如果该组不匹配,则返回-1

示例:

String s = "AAAAAAABBCCCDDABQ";
StringBuffer buf = new StringBuffer();
Pattern p = Pattern.compile("(A+B+)|(C+D+)");
Matcher m = p.matcher(s);
while (m.find()) {
    if (m.start(1) != -1) { // Group 1 found
        System.out.println("Found AB: " + m.group(1));
        m.appendReplacement(buf, ""); // Replace matched substring with ""
    } else if (m.start(2) != -1) { // Group 2 found
        System.out.println("Found CD: " + m.group(2));
        m.appendReplacement(buf, ""); // Replace matched substring with ""
    }
}
m.appendTail(buf);
String remain = buf.toString();
System.out.println("Remain: " + remain);

输出

Found AB: AAAAAAABB
Found CD: CCCDD
Found AB: AB
Remain: Q

答案 1 :(得分:1)

此解决方案假定字符串始终以Q结尾。

String s="AAAAAAABBCCCDDABQ";

Pattern abPattern = Pattern.compile("A+B+");
Pattern cdPattern = Pattern.compile("C+D+");


while (s.length() > 1){

    Matcher abMatcher = abPattern.matcher(s);
    if (abMatcher.find()) {
        s = abMatcher.replaceFirst("");
        //Do other stuff
    }

    Matcher cdMatcher = cdPattern.matcher(s);
    if (cdMatcher.find()) {
      s = cdMatcher.replaceFirst("");
        //Do other stuff
    }

}
System.out.println(s);

答案 2 :(得分:0)

你可能正在寻找这样的东西:

String input = "AAAAAAABBCCCDDABQ";
String result = input;
String[] chars = {"A", "B", "C", "D"}; // chars to replace

for (String ch : chars) {
    if (result.contains(ch)) {
        String pattern = "[" + ch + "]+";
        result = result.replaceAll(pattern, ch);
    }
}

System.out.println(input); //"AAAAAAABBCCCDDABQ"
System.out.println(result); //"ABCDABQ"

这基本上取代了每个角色的序列。

如果您想完全删除序列,只需将ch替换为""replaceAll方法参数中的{{1}}。