2016-07-31 15 views
4

Javaの文字列から重複する部分文字列を「減らす」正規表現を作成しようとしています。たとえば、以下の入力のために:文字列から重複した部分文字列を削除するJava正規表現

The big black dog big black dog is a friendly friendly dog who lives nearby nearby. 

私は次の出力を取得したいのですが:

The big black dog is a friendly dog who lives nearby. 

これは、これまで私が持っているコードです:ある

String input = "The big black dog big black dog is a friendly friendly dog who lives nearby nearby."; 

Pattern dupPattern = Pattern.compile("((\\b\\w+\\b\\s)+)\\1+", Pattern.CASE_INSENSITIVE); 
Matcher matcher = dupPattern.matcher(input); 

while (matcher.find()) { 
    input = input.replace(matcher.group(), matcher.group(1)); 
} 

文の最後を除いてすべての重複部分文字列に対してうまくいく:

The big black dog is a friendly dog who lives nearby nearby. 

私の正規表現では、部分文字列の各単語の後に空白が必要であることを理解しています。つまり、空白ではなくピリオドを含むケースをキャッチしません。私はこれの回避策を見つけることができないようだ、私はキャプチャグループで遊んでみても、空白や空白の代わりにピリオドを探す正規表現を変更しましたが、このソリューションは、サブストリングの各重複部分の後の期間( "近傍。覚醒")。

誰かが正しい方向に向けることができますか?理想的には、この方法の入力は短い段落であり、単一行だけではありません。

+1

正規表現を使用するか、効率的なソリューションに興味がありますか? – Matt

+0

私は正規表現を実際に使う必要はありません。私は、正規表現が重複したフレーズを簡単に見つけ出し、重複する単語を見つけられないと思いました。他の解決策も歓迎されるでしょう! –

答えて

3

あなたは

input.replaceAll("([ \\w]+)\\1", "$1"); 

を使用することができますがlive demo:

import java.io.*; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     String input = "The big black dog big black dog is a friendly friendly dog who lives nearby nearby."; 

     Pattern dupPattern = Pattern.compile("([ \\w]+)\\1", Pattern.CASE_INSENSITIVE); 
     Matcher matcher = dupPattern.matcher(input); 

     while (matcher.find()) { 
      input = input.replaceAll("([ \\w]+)\\1", "$1"); 
     } 
     System.out.println(input); 

    } 
} 
+0

それは次の入力にはうまくいかないでしょう "大きな黒い犬は大きな黒い犬は近くに住んでいるフレンドリーフレンドリー犬です。 – Matt

+0

@Matt OPは重複の矛盾について何も言わなかった。たとえそうしたとしても、同じ正規表現を使用してこのように重複排除することができます。これは、文字列がもう一致するまで置換を繰り返すことです。 – nicael

+0

@Mattは編集を参照してください:) –

2

両方@Thomasアヨブの答えを組み合わせるとマットさんのコメント@を参照してください。

public class Test2 { 
    public static void main(String args[]){ 
     String input = "The big big black dog big black dog is a friendly friendly dog who lives nearby nearby."; 
     String result = input.replaceAll("\\b([ \\w]+)\\1", "$1"); 
     while(!input.equals(result)){ 
      input = result; 
      result = input.replaceAll("\\b([ \\w]+)\\1", "$1"); 
     } 
     System.out.println(result); 
    } 
} 
+0

なぜ' result'を紹介しますか? –

+0

@ThomasAyoub Hmmm、読みやすくするためかもしれない。あなたの意見は何ですか? – Gearon

関連する問題