Rubyにおける正規表現
Rubyでも正規表現は使われるが、文字列マッチメソッドを使った方が早いので、正規表現を使うのは次なる手として考えた方がいい。
複雑なパターンを調べたい場合は正規表現を使うが、「開始文字列」「終了文字列」とのマッチを単純にチェックするだけなら、start_with?やend_with?でマッチを取る方が可読性の上でも速度面からもよい。
文字列マッチメソッド
start_with? -> 特定の文字で始まるかを判定。boolean型。 end_with? -> 特定の文字で終わるかを判定。boolean型。 include? -> 特定の文字を含むか判定。boolean型。 file_name = 'test_some_kind_of_long_file_name.rb' # 複数の文字を渡せられる file_name.start_with?('empty', 'void', 'test_') #=> true file_name.end_with?('useless', 'missing', 'rb') #=> true # 1つの文字のみを渡せられる。複数はだめ。 file_name.include?('empty') #=> true file_name.include?('rb','a') #=> wrong number of arguments (given 2, expected 1) # splat演算子*を使うことで、配列も渡せる array = %w(empty void test_) file_name = 'test_some_kind_of_long_file_name.rb' file_name.start_with?(*array) #=> true
備考
ちなみに%wは「%w記法」と言われる配列記法。全ての要素が文字列であるかシンボルだけであるなら、これを使える。以下のようにすっきり記述できる。
# 文字列配列は「%w」 array = ["A", "B", "C"] array = %w(A B C) # シンボル配列は「%i」。注意!! array2 = [:a, :b, :c] array2 = %i(a b c)
正規表現による判定
主に
- sub
- gsub
- match
の三つがある。
str.sub(pattern, replacement) # 正規表現のパターンにマッチした最初の部分、つまり1つだけを文字列に置換する。 str = "田中さん、こんにちは" str.sub(/さん/, "君") => "田中君、こんにちは" str.gsub(pattern, replacement) # 正規表現のパターンにマッチした全ての部分を文字列に置換 str = "咲いた、咲いた、チューリップが咲いた" str.gsub(/咲いた/, "咲かない") => "咲かない、咲かない、チューリップが咲かない" str.match(pattern) # 引数の正規表現をパターンマッチを行う。マッチしたときはMatchDataオブジェクトを返しマッチしなかったときはnilを返す。つまり、パターンにマッチする文字列を取得するメソッド。 str = "りんごが食べたい" str = str.match(/.+が食べたい/) => #<MatchData "りんごが食べたい"> str[0] => "りんごが食べたい"
文字クラスの略記法
良く使われる文字クラスには省略記法が存在する。
\w -> 単語構成文字 [a-zA-Z0-9]
\W -> 非単語構成文字 [^a-zA-Z0-9]
\s -> 空白文字 [ \t\r\n\f\v]
\S -> 非空白文字 [^ \t\r\n\f\v]
\d -> 10進数字 [0-9]
\D -> 非10進数字 [^0-9]
\h -> 16進数字 [0-9a-fA-F]
\H -> 非16進数字 [^0-9a-fA-F]
/\w+/.match("ABCdef") # => nil /\W+/.match("ABCdef") # => #<MatchData "ABCdef"> /\s+/.match(" ") # => nil /\S+/.match(" ") # => #<MatchData " ">
繰り返し
以下のメタ文字列は繰り返しを表現する
'
* 0回以上
+ 1回以上
? 0回もしくは1回
{n} ちょうどn回(nは数字)
{n,} n回以上(nは数字)
{,m} m回以下(mは数字)
{n,m} n回以上m回以下(n,mは数字)