2017-02-16 2 views
2

私は私が興味入力から私にいくつかの組み合わせのペアを与える正規表現を作成しようとしているとの言葉を生成する。正規表現は、連続した文字

私は、次の入力を持っていた場合...

"pppeeeople"

私は、次の順列...

人、ppeeople、peeople、ppeopleを作成したいと思います。

入力単語が「pppeeeople」の次の2つのREGEXで、「人」と「ppeeople」を作成できます。

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

私は、最初のinputed二重文字列をスキップすることができます「ppeople」、その後、別のREGEXとしても2つのconsective文字の1セットで単語をつかむことができREGEXを生成できるようにしたいと思いますが「ピープル」などを生み出す。基本的な考え方は、2つの連続する文字を含む単語のすべての順列を得ることです。

これはREGEXで可能ですか?または、ループとStringBuilderをリストに使用するだけですか?

これは近いですが、それは境界のインデックスエラーの外に生成し、私はまだ私はそれを追加しているのArrayListの繰り返しから重複を削除する必要があります。

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

"ループとStringBuilderをリストに使用するだけですか?"ほとんどの場合、はい。 – Sneftel

+1

より良いアプローチは、バックトラック再帰で文字列を構築することです。あなたがこのようなことが必要な場合、私はあなたのためにスニペットを書くことができます。 –

+0

私はそうですが、再帰はStringBuilderや部分文字列メソッドを使うよりも良いでしょうか?私は、ほとんど私が欲しいものをやっているが、まだかなりはしていない、ぐずぐずな部分文字列ループを行っている。 – Yawn

答えて

0

申し訳ありませんすべての置換された文字列を返す単一の正規表現はありません。代わりに、リスト内のすべての文字列を返す再帰的メソッドを使用する方が好きです。

これを行う場合は、answers hereを参照してください。

C++には、next_permutation()というstlアルゴリズムの関数があり、与えられた文字列から次の置換された文字列を返します。

UPDATE

ここで問題の編集によると、予想通りcombinations配列リストは、組み合わせの全てが含まれています。ここ一定のstring-

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

の組み合わせを取得するためのスニペットです。あなたの代わりにすべてのいくつかの組み合わせをしたい場合はthis-

Combination cmb = new Combination(); 

cmb.generate("pppeeeople"); 

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

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

今、あなたは長さに基づいて独自のルールを追加する必要がありますようにあなたはきれいではありません

+0

すべての順列を探しているわけではありません。私は繰り返しのいくつかの組み合わせを探しています。もしあなたが「ヒールロー」を持っていれば、ヒーロー、ヒーロー、ハロー、ヒーローを返したい。 – Yawn

+0

しかし、あなたの最初の行で、あなたは順列について言いました。私はそれを更新します。今私に知らせてください、あなたはまた、左から右へ文字のシーケンスを維持したいですか? –

+0

はい私はそう信じています – Yawn

0

など繰り返し、文字、それを呼び出すことができますが、それは作るん所望の出力。

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); 
     } 
    } 
関連する問題