正規表現
正規表現を使うことで、ある文字列から特定のパターンに一致する部分を検索したり切りだしたりすることができます。
正規表現オブジェクトは以下のように生成します。
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"
次に、プログラムの制御構造の書き方について説明します。