Edited at

正規表現の後方参照を用いて、重複した文字列を見つける方法

More than 3 years have passed since last update.

文字列から重複した部分を抽出したい時、ありますよね。

この方法を知っていれば、for文を用いて難解なロジックを組まずとも解決出来ます。


サンプルデータ

住所の正規化を行う際に、大字の前後に同じ文字列が入ることがあります。

今回は次の住所を例に正規表現を紹介します。


  • 入力:東京都日野市日野大字日野123-4

  • 出力:東京都日野市日野123-4


サンプルコード

次のように、後方参照を用いて、直前で評価された結果の文字列を\1と参照してマッチさせる手法を使います。

# 同一な文字列があればマッチしたものが取得できます

pry(main)> '東京都日野市日野大字日野123-4'.match(/(.+)大字(\1)/)
=> #<MatchData "日野大字日野" 1:"日野" 2:"日野">

# 同一な文字列が無いと、空文字が返ります
pry(main)> '東京都日野市日野大字ああ123-4'.match(/(.+)大字(\1)/)
=> #<MatchData "大字" 1:"" 2:"">

# 重複文字列の抽出にも応用できます
pry(main)> '東京都日野市日野市ほげほげ'.match(/(.+)(\1)/)
=> #<MatchData "日野市日野市" 1:"日野市" 2:"日野市">

あとはお好きなように、アレンジしてみてください。


併せて読みたい