2017-02-16 12 views
2

Ich versuche, einen regulären Ausdruck zu erstellen, die mir ein paar Kombinationspaare aus einem Eingang, die mich interessieren.Regex ein Wort mit aufeinander folgenden Buchstaben zu produzieren

Wenn ich habe die folgende Eingabe ...

gibt

"pppeeeople"

Ich mag würde die folgenden Permutationen ...

Menschen, ppeeople, peeople, ppeople erstellen.

Ich kann derzeit 'people' und 'ppeeople' mit den folgenden zwei REGEXs erstellen, wo das Eingabewort 'pppeeeople' ist.

String temp = word.replaceAll("(.)\\1{2,}", "$1$1"); //result ppeeople 
String temp2 = word.replaceAll("(.)\\1{1,}", "$1"); //result people 

aber ich möchte in der Lage sein, eine REGEX zu erzeugen, die auch das Wort mit 1 Satz von zwei consective Buchstaben, wie ‚ppeople‘ greifen kann, dann eine andere REGEX, die die erste inputed Doppelzeichensequenz überspringen und produzieren "People" und so weiter. Die Grundidee besteht darin, alle Permutationen des Wortes zu erhalten, die zwei aufeinanderfolgende Zeichen enthalten.

Ist das mit einem REGEX möglich oder soll ich einfach eine Schleife und StringBuilder in eine Liste einfügen?

Das ist nahe, aber es erzeugt Out-of-Bound-Indexfehler, und ich müsste immer noch Duplikate aus den ArrayList-Wiederholungen entfernen, zu denen ich es hinzufüge.

int index = temp.length(); 

     for (int i = 0; i < index; i++) { 
      System.out.println("Index" + i + ": " + temp); 
      if(temp.charAt(i) == temp.charAt(i+1)) { 
       StringBuilder sb = new StringBuilder(temp); 
       repeats.add(temp); 
       sb.deleteCharAt(i); 
       temp = sb.toString(); 
      } 
     } 
+2

"sollte ich nur eine Schleife und StringBuilder in einer Liste verwenden?" Fast immer, ja. – Sneftel

+1

Besserer Ansatz ist der Aufbau von String mit Backtracking-Rekursion. Wenn du so etwas brauchst, schreibe ich dir vielleicht einen Ausschnitt. –

+0

tue ich - aber wäre Rekursion besser als nur StringBuilder oder Teilstring-Methode verwenden? Ich habe eine wonky Teilstring-Schleife, die fast macht, was ich will, aber noch nicht ganz. – Yawn

Antwort

0

Leider gibt es keinen einzigen regulären Ausdruck, der alle permutierten Strings zurückgibt. Stattdessen bevorzuge ich rekursive Methode, die alle Zeichenfolgen in einer Liste zurückgibt.

Wenn Sie dies tun möchten, siehe answers here.

In C++ gibt es eine Funktion in STL-Algorithmus namens next_permutation(), die die nächste permutierte Zeichenfolge aus der angegebenen Zeichenfolge zurückgibt.

UPDATE

Nach der Bearbeitung der Frage hier ist ein Ausschnitt Kombinationen einer gegebenen Saiten-

public class Combination { 

    //Use Set/HashSet instead of ArrayList if you do not want duplicate string 
    //Set<String> combinations = new HashSet<String>(); 
    private ArrayList<String> combinations = new ArrayList<>(); 

    public void generate(String instr) { 
     generate(instr, new StringBuffer(), 0); 
    } 
    private void generate(String instr, StringBuffer outstr, int index) { 
     for (int i = index; i < instr.length(); i++) { 
      outstr.append(instr.charAt(i)); 

      // Here you may add your rules to avoid all combinations 
      combinations.add(outstr.toString()); 

      generate(instr, outstr, i + 1); 
      outstr.deleteCharAt(outstr.length() - 1); 
     } 
    } 

    public ArrayList<String> getCombinations() { 
     return combinations; 
    } 
} 

Hier ist die combinations Array-Liste zu bekommen alle Kombinationen enthalten wie erwartet . Sie können es nennen wie this-

Combination cmb = new Combination(); 

cmb.generate("pppeeeople"); 

ArrayList<String> list = cmb.getCombinations(); 

for(String str : list){ 
    System.out.println(str); 
} 

Nun, wenn Sie statt alle paar Kombinationen wollen, sollten Sie Ihre eigenen Regeln hinzufügen, je nach Länge, Charakter, Wiederholungen usw.

+0

Nicht für alle Permutationen suchen. Ich suche ein paar Kombinationen einer Wiederholung. Wenn du 'hheelloo' hast, möchte ich hhelo, heelo, hallo, heloo zurückgeben. – Yawn

+0

Aber in der ersten Zeile von Ihnen Frage haben Sie über Permutation gesagt. OK, ich werde es aktualisieren. Lassen Sie mich wissen, möchten Sie auch die Reihenfolge der Buchstaben von links nach rechts beibehalten? –

+0

Ja, ich glaube schon – Yawn

0

nicht schön, aber es produziert die gewünschte Ausgabe.

int index = temp.length(); 

    for (int i = 0; i < index; i++) { 
     // System.out.println("Index" + i + ": " + temp); 
     try{ 
      if(temp.charAt(i) == temp.charAt(i+1)) { 
       StringBuilder sb = new StringBuilder(temp); 
       repeats.add(temp); 
       sb.deleteCharAt(i); 
      // System.out.println("Sb after delete: " + sb.toString()); 
       temp = sb.toString(); 
      // System.out.println("New Temp: " + temp); 
      } 
     } catch (Exception e) { 
      //print.stackTrace(e); 
     } 
    } 
Verwandte Themen