Hatena::Grouprubyist

Rubyをラクガク(正規表現編) RSSフィード

2009-11-22

[] 背景  背景 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  背景 - Rubyをラクガク(正規表現編)  背景 - Rubyをラクガク(正規表現編) のブックマークコメント

正規表現の本を読んだものの、どうアウトプットするか困り果て、ここでRubyで淡々とおさらいをしていこうかと思い立った次第です。

詳説 正規表現 第3版

詳説 正規表現 第3版

[] 選択  選択 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  選択 - Rubyをラクガク(正規表現編)  選択 - Rubyをラクガク(正規表現編) のブックマークコメント

|

選択(alternative)。優先順位が低いので下の「グループ化」とあわせて使うことが多い。

プログラミング言語 Ruby リファレンスマニュアル
puts "/hoge|foo|bar/ =~ 'hoge': #{/hoge|foo|bar/ =~ 'hoge'}"
puts "/hoge|foo|bar/ =~ 'a foo': #{/hoge|foo|bar/ =~ 'a foo'}"
puts "/hoge|foo|bar/ =~ 'not found.': #{/hoge|foo|bar/ =~ 'not found.'}"
/hoge|foo|bar/ =~ 'hoge': 0
/hoge|foo|bar/ =~ 'a foo': 2
/hoge|foo|bar/ =~ 'not found.':

true/falseではなく、どこにマッチしたか位置が返ってくるのか。あまり戻り値をどう使うか気にしたことなかった。

[] 単語境界  単語境界 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  単語境界 - Rubyをラクガク(正規表現編)  単語境界 - Rubyをラクガク(正規表現編) のブックマークコメント

\b

文字クラス指定の外では語境界 (\w と \W のあいだにマッチ)。文字クラス指定内ではバックスペース (0x08)。

プログラミング言語 Ruby リファレンスマニュアル
puts "/\bhoge\b/ =~ 'foo bar hoge': #{/\bhoge\b/ =~ 'foo bar hoge'}"
puts "/\bhoge\b/ =~ 'foo hoge bar': #{/\bhoge\b/ =~ 'foo hoge bar'}"
puts "/\bhoge\b/ =~ 'hoge foo bar': #{/\bhoge\b/ =~ 'hoge foo bar'}"
puts "/\bほげ\b/ =~ 'ふー、ほげ、ばー': #{/\bほげ\b/ =~ 'ふー、ほげ、ばー'}"
puts "/\bほげ\b/ =~ 'ふー ほげ ばー': #{/\bほげ\b/ =~ 'ふー ほげ ばー'}"
hog/ =~ 'foo bar hoge': 8
hog/ =~ 'foo hoge bar': 4
hog/ =~ 'hoge foo bar': 0
ほ/ =~ 'ふー、ほげ、ばー':
ほ/ =~ 'ふー ほげ ばー':

一応日本語を試してみたけど、やっぱりNGだった(ruby-1.8.7p174)。「語境界 (\w と \W のあいだにマッチ)」なので、そうだよねー、という。

\w

英数字。[0-9A-Za-z_] と同じ。

プログラミング言語 Ruby リファレンスマニュアル

[] 量指定子の対象をグループ化  量指定子の対象をグループ化 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  量指定子の対象をグループ化 - Rubyをラクガク(正規表現編)  量指定子の対象をグループ化 - Rubyをラクガク(正規表現編) のブックマークコメント

「1.4.10 丸括弧と後方参照」にて、

これまで丸括弧(())の2つの使い方について見てきた。「|」の対象を制限する使い方と、疑問符(?)やスター(*)といった、量指定子の対象をグループ化する使い方である。

とあるが、「疑問符(?)やスター(*)といった」のスターの例を見た覚えが無かったのでやってみた。

puts "/hoge(foo)*bar/ =~ 'hogefoobar': #{/hoge(foo)*bar/ =~ 'hogefoobar'}"
puts "/hoge(foo)*bar/ =~ 'hogefoofoobar': #{/hoge(foo)*bar/ =~ 'hogefoofoobar'}"
puts "/hoge(foo)*bar/ =~ 'hogefoofobar': #{/hoge(foo)*bar/ =~ 'hogefoofobar'}"
puts "/hoge(foo)*bar/ =~ 'hogebar': #{/hoge(foo)*bar/ =~ 'hogebar'}"
/hoge(foo)*bar/ =~ 'hogefoobar': 0
/hoge(foo)*bar/ =~ 'hogefoofoobar': 0
/hoge(foo)*bar/ =~ 'hogefoofobar':
/hoge(foo)*bar/ =~ 'hogebar': 0

確かに*(スター)も対象をグループ化して使うことができる。

[] 後方参照  後方参照 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  後方参照 - Rubyをラクガク(正規表現編)  後方参照 - Rubyをラクガク(正規表現編) のブックマークコメント

正規表現 \1 \2 ... \n は、後方参照です。n 番目の括弧(正規表現 ( ) グルーピング)にマッチした文字列にマッチします。

プログラミング言語 Ruby リファレンスマニュアル

置換する時にはよくお世話になっている後方参照をマッチのみで使用する。

puts "/(hoge)(foo)\1\2/ =~ 'hogefoohogefoo': #{/(hoge)(foo)\1\2/ =~ 'hogefoohoge\
foo'}"
puts "/(hoge)(foo)\1\2/ =~ 'hogefoo': #{/(hoge)(foo)\1\2/ =~ 'hogefoo'}"
puts "/(hoge)(foo)\1*\2*/ =~ 'hogefoo': #{/(hoge)(foo)\1*\2*/ =~ 'hogefoo'}"
puts "/(hoge)(foo)\1+\2+/ =~ 'hogefoohogefoo': #{/(hoge)(foo)\1+\2+/ =~ 'hogefoo\
hogehogehogefoofoo'}"
/(hoge)(foo)^A^B/ =~ 'hogefoohogefoo': 0
/(hoge)(foo)^A^B/ =~ 'hogefoo':
/(hoge)(foo)^A*^B*/ =~ 'hogefoo': 0
/(hoge)(foo)^A+^B+/ =~ 'hogefoohogefoo': 0

正規表現リテラルをキレイに書きたい。

ゲスト



トラックバック - http://rubyist.g.hatena.ne.jp/hsyd/20091122