1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyでの正規表現の使い方基本ガイド

2022-02-03 22:17:23

正規表現の組み込みサポートが通常 Ruby、Perl、awk のようなスクリプト言語に限定されているのは残念です。その神秘性にもかかわらず、正規表現は強力なテキスト処理ツールなのです。正規表現はその神秘性にもかかわらず、強力なテキスト処理ツールです。それをライブラリのインタフェースではなく、ビルトインでサポートすることには大きな違いがあります。

正規表現とは、簡単に言えば、文字列の中でマッチする文字パターンを指定する方法です。Rubyでは、スラッシュ(/pattern/)の間にパターン(pattern)を書いて、正規表現を作るのが一般的です。また、RubyはRubyで、正規表現はオブジェクトであり、そのように操作することができる。

例えば、次のような正規表現でパターンを書くと、PerlやPythonを含む文字列にマッチします。

コピーコード コードは以下の通りです。
/Perl|Python/

直前のスラッシュはパターンを定義するもので、マッチする2つの部分文字列をパイプ文字(|)で区切ったものである。パイプ文字は、"右側の文字列か左側の文字列のどちらか"を意味します。この例では、それぞれPerlとPythonです。算術式のように、パターンに括弧を使うことができるので、パターンは以下のように書くことができます。

コピーコード コードは以下の通りです。
/P(erl|ython)/

パターンには、繰り返し(反復)を指定することもできます。/ab+c/ は、a、その後に 1 つ以上の b、そして c を含む文字列にマッチします。パターンのプラス記号をアスタリスクに変更すると、 /ab*c/ は、a、ゼロ以上の b、そして c の順にマッチする正規表現を作成します。

また、パターン内の1つまたは複数の文字のグループにマッチさせることも可能です。よくある例としては、空白文字(スペース、タブ、キャリッジリターンなど)にマッチする \s、任意の数字にマッチする \d、単語内に現れる任意の文字にマッチする \w などの文字クラスがあります。ドット(.)はほとんどすべての文字にマッチします。

一度作ったパターンを使わないのは、いつでも恥ずかしいことである。正規表現を使った文字列のマッチングには、=~マッチ演算子を使うことができます。文字列の中にパターンがあれば、=~はパターンの先頭を返し、そうでなければnilを返します。つまり、if文やwhile文の条件として正規表現を使うことができるのです。例えば、文字列にPerlやPythonが含まれている場合、次のようなメッセージが出力される。

コピーコード コードは以下の通りです。
if line=~/Perl|Python/

 puts "Scripting language mentioned:#{line}"

end

正規表現にマッチした文字列の部分は、Ruby の置換メソッドのいずれかを使って他のテキストに置き換えることができる。

コピーコード コードは以下の通りです。
line.sub(/Perl/,'Ruby') #Replace the first 'Perl' with 'Ruby'

line.gsub(/Python/,'Ruby') #Replace all 'Python' with 'Ruby'

以下の文を使って、PerlやPythonが登場する箇所をすべてRubyに置き換えてください。

コピーコード コードは以下の通りです。
line.gsub(/Perl|Python/,'Ruby')