2016-05-07 8 views
0

私は辞書内の正しい単語を見つけるために文字列を繰り返して処理しようとしています。javaの3文字以上連続する文字を2文字連続して削除するにはどうすればよいですか?

私が使用しなければならないアプローチは、3つ以上の連続する文字を持つ単語を見つけて、それらを2つの連続する文字に削除することです。

この単語が存在する場合は、辞書で検索します。単語が存在しない場合は、2つの連続する文字を1文字のみにする必要があります。

例:

gooooooood -> good (this existis) 
awesooooome -> awesoome (this doesn't exist) -> awesome (this exists) 
aaawwwesooooooommmme -> aawwesoomme (this doesn't exist) -> awesome (this exists) 

私はJAVAで働いていると私はすでに文字列の3つの以上の繰り返し文字で単語を取得するには、この正規表現を使用しています:

Pattern p = Pattern.compile("\\b\\w*(\\w)\\1{2}\\w*"); 
+0

"gggoood" - > "ggood" - > "god"? –

+0

サシャ・サラウィー、それはよく指摘されています。その場合は、まず子音と母音をまず実行する必要があると思います。 "ggood" - > "ggoood" - > "goood" - > "good" – user1201779

+0

3から1を削除し、2から削除するのと同等ですか? – Rafael

答えて

1

あなたは

(\b\w*?)(\w)\2{2,}(\w*) 

文字列バージョン:

0この正規表現( "純粋なバージョン")を使用することができます
"(\\b\\w*?)(\\w)\\2{2,}(\\w*)" 

あなたは、交換で$numberは、対応するキャプチャグループの内容を参照することをreplaceAll(regex, "$1$2$2$3")

説明

(\b\w*?) // capture group 1 is lazy 
(\w)  // capture group 2 captures the first occurrence of the char 
\2{2,} // char may occur 2 or more times... 
(\w*) // capture group 3 

注意を使用する必要があります。

1

また、このようにそれを行うことができます。

Pattern pattern = Pattern.compile("(\\w)\\1{2,}"); 
System.out.println(pattern.matcher("gooooooood").replaceAll("$1$1")); 
System.out.println(pattern.matcher("awesooooome").replaceAll("$1$1")); 
System.out.println(pattern.matcher("aaawwwesooooooommmme").replaceAll("$1$1")); 

出力:

good 
awesoome 
aawwesoomme 

そして第二段階のためは、ここにあなたがそれを行うことができる方法である。

Pattern pattern2 = Pattern.compile("(\\w)\\1"); 
System.out.println(pattern2.matcher("awesoome").replaceAll("$1")); 
System.out.println(pattern2.matcher("aawwesoomme").replaceAll("$1")); 

出力:

awesome 
awesome 
関連する問題