2016年7月27日(水)にNTT-ATさんの会議室にてkawasaki.rb #039を開催しました。
togetterのまとめはこちら
パーフェクトRuby読書会
5-3-4 先頭と末尾
「\A」は文字列の先頭、「\z」は末尾を表します。
1
2
3
4
5
pattern = /\A\d{3}-\d{4}-\d{4}\z/
pattern === '080-1234-5678' # => true
pattern === 'Phone: 080-1234-5678' # => false
pattern === '080-1234-5678 (mobile)' # => false
「^」と「$」は文字列全体ではなく行頭と行末を表します。
1
2
3
4
lines = "1234\nabcd"
/\A\d+\z/ === lines # => false
/^\d+$/ === lines # => true (1行目でマッチする)
5-3-5 グルーピングと後方参照/部分式呼び出し
()によるグルーピングを行った箇所は後で「\1」や「\2」という形で参照できます。 「/(B)\ to\ \1/」には ‘B to B’がマッチします。これを後方参照といいます。
todo
1
2
3
/(B)\ to\ \1/ === 'B to B' # => true ('B to B'がマッチ)
$1 # => "B" (直前にマッチした文字列)
グルーピングにはラベルをつけることができます。
1
2
3
/(?<number>[0-9]+)/ === 'abc-123'
Regexp.last_match[:number] # => "123"
「\k
1
/(?<num>[0-9]+)[a-c\-]+\k<num>/ === '123-abc-123'
なおRuby 2.4では MatchData#named_captures が追加されるようです。 既に2.4.0のpreviewに含まれているので試すことが可能です。
「\g
1
2
3
4
5
6
7
8
9
10
11
12
13
phone = '080-1234-5678'
# 「\g<1>」は「([0-9]+)」に置き換えられる
/([0-9]+)-\g<1>-\g<1>/ === phone # => true
# 「\1」は最初にマッチした "080" となるため、これはマッチしない
/([0-9]+)-\1-\1/ === phone # => false
# こちらはマッチする
/([0-9]+)-\1-\1/ === '080-080-080' # => true
# ラベルの指定も可能
/(?<num>[0-9]+)-\g<num>-\g<num>/ === phone # => true
正規表現の後方参照は他の言語にも採用されているのか?という話になり、調べたところ正規表現エンジンの鬼車(Ruby 2.0からは鬼雲)由来のものらしく、これを搭載した言語であれば使えそう、という結論になりました。参考
次回は「5-3-6 先読みと後読み」からです。
今回のiruby notebookは以下のとおりです。
セッション
本日のセッションは4本(うち2本はオフレコ)ありました。
英語ブログをhugoで書き始めた話 from @chezouさん
英語ブログをGOで実装された、JekyllライクWebサイトエンジンHUGOで運営しはじめた話をされました。 HUGOの良い所はJekyllのようにRubyとGemをインストールする手間がなくbrew installで完結(Goを入れる必要もない)し、Webページのビルドも高速なところだそうです。 また、ドメインはgandi.netで取得したそうです。(メールボックスが5個までついてくるらしい)
chezouさんの英語ブログはこちら
capistranoでエラーが発生する相談 from @take_she12
capistrano経由でコマンドを実行したらエラーで失敗してしまう、という話をされました。 具体的には
というエラーが発生するというもの。 /usr/bin/env からtestが見つからないのは恐らくtimeがbashの組み込み関数によるからで、 bash -c 経由でコマンドを渡してあげれば良いかもしれない、という結論になりました。
次回予告
次回は2016年9月28日(水)(毎月第4水曜日)開催予定です。お待ちしております。
寄稿者について
松久保 敬人 (@Peranikov)
node.jsやiOSアプリ開発を経て今はRailsとDDDとScalaの人。