文字列から重複した部分を抽出したい時、ありますよね。
この方法を知っていれば、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:"日野市">
あとはお好きなように、アレンジしてみてください。
併せて読みたい
- JavaScriptの動かないコード (中級編) 正規表現で同じ文字の連続を検出したい - 置換前パターン中での後方参照 - 主に言語とシステム開発に関して
http://d.hatena.ne.jp/language_and_engineering/20080927/1222508705