Help us understand the problem. What is going on with this article?

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

More than 5 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:"日野市">

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

併せて読みたい

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away