2017-09-21 15 views
2

言語:VBA 環境:2007 エクセル ツール:正規表現オブジェクト重複する単語を入力文字列から削除します。使用VBA正規表現

こんにちは!私はアドレスを表す入力文字列から重複した単語を削除しようとしています。 アドレス帳を組み合わせたExcelワークシートの列が表示されます。それはキリル文字ではありませんが、英語で表現するためならば、それはこのようなものを見てみましょう:

125424, RepeatedName, RepeatedName, and some words, 75 
194044, Repeated-dashedName, Repeated-dashedName, other Uniques, 3 
300911, Normal non-repeated, names, dashed and non-Dashed, 123 

テキストは大文字と小文字を区別しないで、数字、句読点、スペースを含めることができます。重複する単語はまったく別のものにしか現れないことが知られています。重複するインスタンスの中には、昏睡やスペース以外の他の「排他的」な単語はありません。 重複した破線と破線のない単語を削除し、繰り返される単語が1つの場合は1つのインスタンスのみを保持する必要があります。 "RepeatedName"の唯一のインスタンスを "Repeated-dashedName"と同じにする必要があります。だから、理想的な結果は次のようになります。

125424, RepeatedName, and some words, 75 
194044, Repeated-dashedName, other Uniques, 3 
300911, Normal non-repeated, names, dashed and non-Dashed, 123 

私はコードの異なるバリエーションを試してみたが、働いても私から脱出され、これを解決するために。私の最高の推測では、このです:

Option Explicit 
Dim strIn As String, strPattern As String, strReplace As String, strResult as String 
dim regex As Object 

strIn = fnGetInputString() 
strPattern = ".*\b((\w+)\b.*\1).*" 
strReplace = "$1" 

If regex Is Nothing Then Set regex = New RegExp 

With regex 
    .MultiLine = False 
    .Global = True 
    .IgnoreCase = True 
    .Pattern = strPattern 
End With 

strResult = regex.Replace(strIn, strReplace) 

が、結果として、私のstrResultは、結果的に私に与えただけで、この:

75 
3 
123 

だから私は正しくキャプチャし、正規表現で繰り返しグループを再利用するために管理していません。 助けていただければ幸いです。

私はregexの新機能ですが、いくつかのドキュメント、記事、ディスカッション、およびStackOverflowの質問を読んでいますが、実際の答えは見つかりませんでした。この正規表現は、たとえば上で動作

+0

などの基本的な正規表現エンジンで、我々は125424 'のようなケースを持つことができます動作しますが、Repea tedName、someOtherWord、RepeatedName、およびいくつかの単語、75'ここで、repeatNameの2番目のインスタンスは文字列のどこにでも(つまり、1番目のインスタンスの直後ではなく)どこにでも置くことができますか? – Gurman

+0

この可能性はゼロではありませんが、それに近いです。そのような場合は無視できます。 –

答えて

3

:基本的に

\b([a-zA-Z-]+)[^a-zA-Z-]+\1\b 

Demo

は、そのように動作します:

文字が [a-zA-Z-]「の文字のASCII感覚に制限されている設定
\b([a-zA-Z-]+)[^a-zA-Z-]+\1\b 
^      ^ assert a word boundary 
^^^^      capture a 'word' series of characters 
       ^    separated by non 'word' characters 
         ^  where the captured word is then repeated 

プラスダッシュ。

非ラテン文字または非ASCII文字セットの場合は、より現代的な正規表現エンジンで\p{L}を使用するか、またはセンスを逆にするかのいずれかが可能です(文字列の末尾に-があることを確認してください)言葉がないものを除くことにより、「単語」の:

\b([^ ,]+)[ ,]+\1\b 

    ^     a word is not a space or a comma... 
      ^   a word delimiter is a space or comma... 

さえ、このようなsed

Demo

+0

dawg、あなたの答えに感謝します。私は論理と力学を理解しています。私は入力文字列で英語とキリルの組み合わせでテストしました。英語でのみ検索と置換を行うことができます。にもかかわらず、私はあなたの与えられた英語の文字の範囲に加えて、大文字と小文字の両方で、私のアルファベットの手紙全体を手紙でタイプしました。 –

+0

だから私は問題が何かエンコーディングや何か他のものがあるかもしれないと思う。 –

+0

excelがサポートしている場合は、 '\ p {L}'の 'letter'にはメタ文字を使用してください。 – dawg