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]
=> "りんごが食べたい"


docs.ruby-lang.org

qiita.com

www.javadrive.jp

文字クラスの略記法

良く使われる文字クラスには省略記法が存在する。

\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は数字)