2009-11-22
■ [正規表現] 背景

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

- 作者: Jeffrey E.F. Friedl,株式会社ロングテール,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/04/26
- メディア: 大型本
- 購入: 24人 クリック: 754回
- この商品を含むブログ (81件) を見る
■ [正規表現] 選択

選択(alternative)。優先順位が低いので下の「グループ化」とあわせて使うことが多い。
no title
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.':
■ [正規表現] 単語境界

\b
文字クラス指定の外では語境界 (\w と \W のあいだにマッチ)。文字クラス指定内ではバックスペース (0x08)。
no title
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
no title
■ [正規表現] 量指定子の対象をグループ化

「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
確かに*(スター)も対象をグループ化して使うことができる。
■ [正規表現] 後方参照

正規表現 \1 \2 ... \n は、後方参照です。n 番目の括弧(正規表現 ( ) グルーピング)にマッチした文字列にマッチします。
no title
置換する時にはよくお世話になっている後方参照をマッチのみで使用する。
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
正規表現リテラルをキレイに書きたい。
コメントを書く