10-2-3 正規表現の書き方やメソッドを確認しよう

色々な正規表現の記述方法

正規表現の基本的な記述方法は/正規表現/のように、正規表現をスラッシュ(/)で囲みます。

正規表現には様々な記述がありますが、次ページ「10-2-2 正規表現に一致する文字列を取り出したり文字列を置き換えよう」で触れた表現方法を中心に代表的な例をあげると以下の通りです。

正規表現の例 意味 記述例 記述例の意味 記述例に一致する文字列の例
^ 次の文字が行頭 /^a/ 行頭がaで始まる1文字 a
$ 前の文字が行末 /r$/ 行末がrで終わる1文字 r
. 改行を除く1文字 /a./ aの後に1文字続く2文字 ai
* 直前の文字が0回以上繰り返す文字列 /^a.*/ 行頭がaで始まる文字列 air
+ 直前の文字が1回以上繰り返す文字列 /a+/ aが続く文字列 aa
{回数} 直前の文字が「回数」分繰り返す文字列 /a{3}/ aが3回繰り返した文字列 aaa
\w 半角英数字1文字 /\w+/ 半角英数字の文字列 pen1
\d 半角数字1文字 /\d+/ 半角数字の文字列 1234
(正規表現) 括弧で囲まれた正規表現に一致する文字列を後で取り出す /(\d{3})/ 半角数字が3つ続く文字列 090
\ 正規表現で特別な意味を持つ記号を文字列として扱う場合に使う /\.$/ 行末がドット(.)で終わる .

=~演算子

正規表現に一致するかどうかの判定を行う為の演算子として=~があります。

/正規表現/ =~ 文字列として正規表現に一致した場合は、一致した文字列の位置を返却します。一致しなかった場合は、nilを返却します。

たとえば、/a/ =~ 'abc'とすると'abc'という文字列でaが現れるのは先頭の1番目なので文字列のインデックスに対応する0が返却されます。同様に、/b/ =~ 'abc'とすると1が、/c/ =~ 'abc'とすると2が返却されます。

matchメソッド

matchメソッドは文字列が持つメソッドです。文字列.match(/正規表現/)と記述します。

文字列が正規表現に一致した場合、MatchDataクラスのオブジェクトを返却します。一致しなかった場合、nilを返却します。

MatchDataクラスのオブジェクトは、正規表現に一致したデータを配列として取り出すことができます。

たとえば、'abc'.match(/a/)[0]とすると一致したaが返却されます。

なお、=~演算子でもmatchメソッドでも、正規表現に括弧で囲まれた部分は、$1$2...という特殊な変数で取り出すことができます。

括弧が複数ある場合、1番目の括弧に一致する文字列が$1に、2番目の括弧に一致する文字列が$2に代入されます。

さらにmatchメソッドを使った場合は、括弧で囲まれた部分を配列のインデックスを指定して取り出すことができます。

たとえば、'abc'.match(/(a)(bc)/)[2]とすると括弧で囲まれた2番目の部分であるbcという文字列が返却されます。

subgsubメソッド

文字列が持つsubgsubメソッドを使用すると、文字列のうち正規表現に一致する部分を書き換えることができます。

文字列.sub(/正規表現/, 置き換える文字列)のように記述します。

subgsubの違いは、subは最初に正規表現に一致した文字列を1度だけ置き換え、gsubは正規表現に一致した全ての文字列を置き換える点です。

前ページ「10-2-2 正規表現に一致する文字列を取り出したり文字列を置き換えよう」の例で、'090-1234-5678'という文字列のハイフン(-)がsubの場合は090の直後だけ置き換わっており、gsubの場合はすべてのハイフンが置き換わっている様子が分かります。

正規表現の書き方やメソッドのまとめ

  • 正規表現を使うことで、文字列が一致するかどうか判断したり、文字列を置き換えたりする処理を効率化できる
  • 正規表現を使って文字列が一致するか判断を行うには=~演算子やmatchメソッドを使う