正規表現

正規表現を使うことで、ある文字列から特定のパターンに一致する部分を検索したり切りだしたりすることができます。

正規表現オブジェクトは以下のように生成します。

irb(main):001:0> r = /[0-9]+/             #「/」で正規表現の記述を囲む
=> /[0-9]+/
irb(main):002:0> r = Regexp.new("[0-9]+") #Regexpクラスで生成
=> /[0-9]+/
irb(main):003:0> r1 = /[0-9]+\/[0-9]+/    #「/」自体は「\/」と書く
=> /[0-9]+\/[0-9]+/
irb(main):004:0> r2 = %r|[0-9]+/[0-9]+|   #%rを使うと「/」のまま記述可能
=> /[0-9]+\/[0-9]+/

 

 ここでは正規表現の記述方法については説明しませんが、代表的な正規表現の例を紹介します。

正規表現
意味 説明
 ^  行頭
 /^abc/
abcで始まる行
 $
 行末
 /abc$/
abcで終わる行
 .
 改行を除く任意の1文字  /a.b/
aとbの間に1文字
 [...]
 [ ]内のいずれか1文字
 /[A-Za-z]/
英字
 [^...]
 [ ]内に含まれない1文字
 /[^0-9]/ 数字以外
 *
 0回以上の繰り返し
 /a.*/
1回以上のaの繰り返し 
 +  1回以上の繰り返し  /a+/
1回以上のaの繰り返し
 {m}  m回の繰り返し  /[0-9]{3}/ 000~999 の数字
 ?  0回または1回  /aa?/ aまたはaa
 a|b  aまたはb  /^(ABC)|(abc)$/ ABCまたはabcの行
 (...)
 グループ化  /(ABC)+/ ABCの一回以上の繰り返し
 \w  英数字と_  /^\w+$/ 英数字のみの行
 \W
 英数字と_以外  /Hello,\WWorld/ Hello,とWorldの間に英数字以外の文字列
 \s  空白文字  /Hello,\sWorld/ Hello,とWorldの間に空白1文字
 \S  空白文字以外  /Hello\SWorld/ HelloとWorldの間に空白以外の文字
 \d  数字
 /a\d/ aと数字1文字
 \D  数字以外  /a\D/ aと数字以外の1文字

 

正規表現による文字列とのマッチングは「=~」演算子で行います。Rubyのマッチングではデフォルトでは欲張りマッチングです。
マッチした場合は、マッチした文字列中の場所の先頭インデックスを返します。また、マッチした部分や前後の文字列を取り出すことができます

irb(main):001:0> r = /[A-Za-z]\d/ #1文字目が英字、2文字目が数字の正規表現
=> /[A-Za-z]\d/
irb(main):002:0> p r =~ "abc123" #正規表現でマッチング
2
=> 2
irb(main):003:0> p $&             #マッチした文字列
"c1"
=> "c1"
irb(main):004:0> p $`             #マッチした文字列の前の文字列
"ab"
=> "ab"
irb(main):005:0> p $'             #マッチした文字列の後の文字列
"23"
=> "23"
irb(main):006:0> p /ABC/ =~ "abc123" #マッチしない場合はnilを返す
nil
=> nil

 

文字列のメソッドと組合せて操作することもできます。 

irb(main):001:0> s = "apple   banana     orange"
=> "apple banana orange"
irb(main):002:0> s.scan(/\w+/)     #英数字の並びを抽出し配列に
=> ["apple", "banana", "orange"]
irb(main):003:0> s.split(/\s+/)     #スペースの並びを区切り文字とし配列に
=> ["apple", "banana", "orange"]
irb(main):004:0> s.gsub(/\s+/, ",") #スペースの並びをカンマに変換
=> "apple,banana,orange"

 

 次に、プログラムの制御構造の書き方について説明します。