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に含まれているので試すことが可能です。

Ruby Doc

ISSUE

「\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さんの英語ブログはこちら

HUGO

gandi.net

capistranoでエラーが発生する相談 from @take_she12

capistrano経由でコマンドを実行したらエラーで失敗してしまう、という話をされました。 具体的には

$ /usr/bin/env if test true;then echo "hoge";fi
-bash: 予期しないトークン `then' 周辺に構文エラーがあります

というエラーが発生するというもの。 /usr/bin/env からtestが見つからないのは恐らくtimeがbashの組み込み関数によるからで、 bash -c 経由でコマンドを渡してあげれば良いかもしれない、という結論になりました。

次回予告

次回は2016年9月28日(水)(毎月第4水曜日)開催予定です。お待ちしております。

寄稿者について

松久保 敬人 (@Peranikov)

node.jsやiOSアプリ開発を経て今はRailsとDDDとScalaの人。

Published: August 24 2016

blog comments powered by Disqus