我目前正在开发一种工具,可以帮助我分析不断增长的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"
,而没有无限循环?
答案 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}}。