RubyとJavaScriptにおける正規表現

正規表現系のメソッドがいつもごちゃごちゃになって、その場その場でリファレンスを見ているので、このタイミングでまとめてみます。

正規表現に対するメソッド体系

用途RubyJavaScript
正規表現のパターンにマッチした最初の部分を文字列に置換するString#subString.prototype.replace
正規表現のパターンにマッチしたすべての部分を文字列に置換するString#gsubString.prototype.replaceAll
正規表現のパターンにマッチする文字のインデックスを返すString#=~String.prototype.search
正規表現のパターンにマッチする文字列を返すString#match or Regexp#matchString.prototype.match
正規表現のパターンにマッチするかどうかをbooleanで返すString#match? or Regexp#match?RegExp.prototype.test
正規表現のパターンにマッチする文字列すべてを返すString#scanString.prototype.matchAll

ちょっと試してみた

正規表現のパターンにマッチした最初の部分を文字列に置換する

'ikuma-t, yamada-d, tanaka-p, okurag, tarou-d'.sub(/-/, '~') 
#=> "ikuma~t, yamada-d, tanaka-p, okurag, tarou-d"
'ikuma-t, yamada-d, tanaka-p, okurag, tarou-d'.replace(/-/, '~') 
// 'ikuma~t, yamada-d, tanaka-p, okurag, tarou-d'

正規表現のパターンにマッチしたすべての部分を文字列に置換する

'ikuma-t, yamada-d, tanaka-p, okurag, tarou-d'.gsub(/-/, '~') 
#=> "ikuma~t, yamada~d, tanaka~p, okurag, tarou~d"
'ikuma-t, yamada-d, tanaka-p, okurag, tarou-d'.replaceAll(/-/g, '~') 
//  'ikuma~t, yamada~d, tanaka~p, okurag, tarou~d'

JavaScriptのString.prototype.replaceAllを使用する際には、グローバルフラグを持つRegExpオブジェクトを指定する必要がある。

正規表現のパターンにマッチする文字のインデックスを返す

'ikuma-t' =~ /.*-./ 
# => 0

'ikumat' =~ /.*-./  
# => nil
'ikuma-t'.search(/.*-./)  
// 0

'ikumat'.search(/.*-./) 
// -1

正規表現のパターンにマッチする文字列を返す

# Regexp#matchの方を使っています
/.*-./.match('ikuma-t') 
# => #<MatchData "ikuma-t">

/.*-./.match('ikumat')  
# => nil
'ikuma-t'.match(/.*-./) 
// [ 'ikuma-t', index: 0, input: 'ikuma-t', groups: undefined ]

'ikumat'.match(/.*-./) 
// null

正規表現のパターンにマッチするかどうかをbooleanで返す

/.*-./.match?('ikuma-t') 
# => true

/.*-./.match?('ikumat')  
# => false
/.*-./.test('ikuma-t') 
// true 

/.*-./.test('ikumat')  
// false

正規表現のパターンにマッチする文字列すべてを返す正規表現のパターンにマッチする文字列すべてを返す

'ikuma-t'.scan(/[aiueo]/) 
# => ["i", "u", "a"]
['ikuma-t'.matchAll(/[aiueo]/g)] 
// [ [ 'i', index: 0, input: 'ikuma-t', groups: undefined ], [ 'u', index: 2, input: 'ikuma-t', groups: undefined ], [ 'a', index: 4, input: 'ikuma-t', groups: undefined ] ]

JavaScriptのString.prototype.matchAllを使用する際には、グローバルフラグを持つRegExpオブジェクトを指定する必要がある。


Buy Me A Coffeeikuma-tにお恵みを!