2017-07-21 2 views
3

Ich arbeite derzeit an einem Tool, das mir hilft, eine ständig wachsende String zu analysieren, die wie folgt aussehen kann: String s = "AAAAAAABBCCCDDABQ". Was ich tun möchte, ist eine Sequenz von A und B zu finden, etwas zu tun und dann diese Sequenz aus dem Original String zu entfernen.Entfernen Muster von String in Java

sieht Ihr Code wie folgt:

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; 

Auch, wie ich die drei Sequenzen entfernen konnte, so dass s enthält nur "Q" am Ende der Berechnung ohne und Endlosschleife?

+1

Ja, aber Sie kann eine Kopie der Zeichenfolge erstellen und speichern sie in einem wandelbaren lokalen Variable. –

+0

Ich äußerte mich unklar, sorry. Ich habe irgendwo in meinem Code eine Funktion, die in regelmäßigen Abständen Zeichen mit "+ =" am Ende meines Strings hinzufügt, das ist es, was ich mit "wachsen" meinte. – schande

+0

@schande Gibt es ein Muster für diese Zeichenfolge oder fügt es nur zufällige Buchstaben hinzu? – CodingNinja

Antwort

4

Sie sollten eine Regex-Ersatzschleife verwenden, d. H. Die Methoden appendReplacement(StringBuffer sb, String replacement) und appendTail(StringBuffer sb).

Um eines von vielen Mustern zu finden, verwenden Sie | regex matcher, und erfassen Sie jedes Muster separat.

Sie können dann group(int group) verwenden, um den gefundenen String für jede Capture-Gruppe zu erhalten (erste Gruppe ist Gruppe 1), die null zurück, wenn diese Gruppe paßt nicht. Um eine bessere Leistung zu erzielen, überprüfen Sie einfach, ob die Gruppe übereinstimmt. Verwenden Sie start(int group), die -1 zurückgibt, wenn diese Gruppe nicht übereinstimmt.

Beispiel:

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

Ausgabe

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

Große Antwort. Ich wünschte, ich könnte es dreimal abstimmen, weil es das verdient. – CodingNinja

+0

Danke Andreas, das hat mir sehr geholfen. :) – schande

1

Diese Lösung geht davon aus, dass die Zeichenfolge immer in Q. endet

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); 
+0

Wenn Sie annehmen, dass der String immer in Q endet, können Sie einfach 's = sstring (s.length() - 1);' Selben Effekt. – CodingNinja

0

Sie wahrscheinlich für so etwas suchen:

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" 

Diese im Grunde Sequenz jedes Zeichen für einzelne ersetzen.

Wenn Sie die Sequenz vollständig entfernen möchten, ersetzen Sie einfach ch zu "" in replaceAll Methodenparameter innerhalb Körper.