2014-01-16

Ruby の正規表現マッチには名前が付けられる

こんなことをやろうと思った。

文字列に「集合場所 ○○」と記入されていたら、○○の部分を抜き出すコード。

最初に思いついたのが、こんなコード。

if /^集合場所 (.+)/ =~ string
  p Regexp.last_match(1)
end

これは何とも読みづらい。最近の Ruby はマッチする () に名前を付けられると聞いた。さっそく試してみる。

if /^集合場所 (?<meeting_place>.+)/ =~ string
  p meeting_place
end

これは見やすくなった!!

蛇足: リファクタリング

コードは一応完成したけれど、一応入力ミス対策も入れておく。集合場所を半角スペースではなく全角スペースやタブで書く人もいるかもしれない。

if /^集合場所[   ](?<meeting_place>.+)/ =~ string
  p meeting_place
end

半角スペース・全角スペース・タブが入ってるけど、見た目で分からない。その上、誰かがソースコードを tabify したらタブが消えてしまう。ここは空白を表す [[:blank:]] を使う。せっかくなので複数スペース対策も入れておこう。

if /^集合場所[[:blank:]]+(?<meeting_place>.+)/ =~ string
  p meeting_place
end

やあ、人によっては「空白区切り」と言っているのに「:」を使うかもしれない。最後にその対策も入れておく。

if /^集合場所[[:blank:]::]+(?<meeting_place>.+)/ =~ string
  p meeting_place
end

半角と全角のコロンも入れた。これで完成。ちょっと見栄えが悪いけど、マッチした文字列との対応が分かり易いのが良いね。

No comments:

Post a Comment