正規一致を使用した重複フィールドの除去

1899 ワード

正規表現という文法は簡単で効率的で有名ですが、iは複雑です.
最近、文字列の重複部分を除去する機能があります.通常の従来の快適な配列を用いて配列に分割するのは、効率が低すぎると感じて性能を浪費します.そこで、正規表現を考えて重複文字列をマッチングし、Stringが独自に導いたreplaceAll法で対応する文字列を削除します.
ターゲット文字列:
"10110,10254,10554,11025,10254,11002,11532,10110,";
これは数字の配列ですが、この中にはいくつかのIDが重複しているので、除去しなければなりません.私は正則文法にあまり詳しくないので、説明ドキュメントを一時的に使用している段階です.良い考えがないので、ネットで考えを調べました.
重複するアルファベットの具体的なコードを除去する類似のソリューションが見つかりました.
String str = "aaaaaaahdbkjsdnfkjsndjkfsdfsdf";   
        str = str.replaceAll("(?s)(.)(?=.*\\1)", "");   
        System.out.println(str);

ざっと見て意味を説明する.
(?s)単行モードDOTALLをオンにして.番号を任意の文字に一致させる  (.)任意の文字を第1のグループにキャプチャする  (?=.*1)これは断言で、後の内容は任意の文字に最初のグループがキャプチャした内容を加えることを意味します.  
第1条:正則のいくつかのモードを開いて、私とあまり関係がないと感じて、私はこれは繰り返しの文字列を除去して、彼はこれはアルファベットを除去します.
第2条から見ると、肝心なのはグループ化で、大体構想が少し印象的だったのか、それともある文字列にマッチして、それから断言を追加したのか、第3条はその断言、つまり現在の文字列をグループ化して、断言の中に入れた後、重複した部分にマッチしたのか.そして私のニーズを修正しました.
String reg = "(\\d{5},)(?=(\\d{5},)*\\1)";
具体的なコードは以下の通りです.
		String str = "abcdeabcdeabcdeaaaaaadddddceeeeabcccccccacadaeec"; 
		String str1 = "10110,10254,10554,11025,10254,11002,11532,10110,";
		String reg = "(\\d{5},)(?=(\\d{5},)*\\1)";
		str = str.replaceAll("(?s)(.)(?=.*\\1)", ""); 
		str1 = str1.replaceAll(reg, "");
//		str = str.replaceAll(reg, ""); 
		System.out.println(str1); 

最初は*を付けていないと断言してマッチングに失敗し、付けなければ1組しかマッチングしないと推測しました.
しかし、私はこの中に制限があることを発見しました.この文字列の配列は私に5つの中に制限されています.もしその中の1つの文字列が5桁を超えたら、マッチングに失敗する可能性があります.これは不足かもしれません.私は今6つをグループとして話しています.それから1つのグループのマッチングを話しているので、この問題があります.他なら、この問題はないはずだ.
はい、しばらく問題を解決しました.この断言はやはり少し理解しにくくて、少し予言の性質を感じて、しかし実際のマッチングの対象の中に入るのではありませんて、主に役に立つのは恐らく現在マッチングの対象に対して更なる制限と条件をして、マッチングの正確性を強めます.これはさらなるテストが必要かもしれません.先にやっておきましたが、まだいろいろな用途があると断言(?<=exp)、(?=exp)、(?!exp)、(?