Rubyの正規表現とは
正規表現とは文字列のパターンを正規式で置き換えたもので、パターン検出や抽出・変換を行うコマンドやプログラム言語で用いられます。
Rubyはオブジェクト指向プログラム言語であり、正規表現をRegexpクラスとして定義しています。そのため正規表現を活用することで、複雑に発生する文字列のパターンマッチングを効率的に行うことができます。
RubyのRegexpクラスとは
Regexpクラスとは正規表現を利用する際に利用するオブジェクトを指します。
パターンをデリミタ'/'(スラッシュ)で囲むか、%r{}(デリミタの変更)、 あるいはRegexp.newまたはRegexp.compileを用い、Regexpクラスのオブジェクトを作成します。 用法: /\w+/ 、または %r{\w+}、または Regexp.new('\w+')、または Regexp.compile('\w+')
Rubyの正規表現の種類
Rubyの正規表現は以下の通り分類されています。 ・メタ文字 パターン中にメタ文字を記述することができます。 ( サブパターンの開始を表します。 ) サブパターンの終了を表します。 [ 文字クラス定義の開始を表します。 ] 文字クラス定義の終了を表します。 { 最小/最大の指定開始を表します。 } 最小/最大の指定終了を表します。 . 改行を除くすべての文字が該当します。 ? 繰り返し方法を指定します。 + 1 回以上の繰り返しを表します。 * 0 回以上の繰り返しを表します。 | 選択枝の開始を表します。 \ 一般的なエスケープ文字を表します。
・式展開 #{式}の形式で正規表現内に式を評価した文字列を入れることができます。
・特殊文字(エスケープ文字) '\'(バックスラッシュ)で始まる特殊文字が利用できます。 \a アラーム、ベル文字を表します。 \cx、\C-x 'control-x', x は任意の文字を指定します。 \e エスケープ文字を表します。 \f 改ページ を表します。 \n 改行を表します。 \r キャリッジ・リターンを表します。 \t タブを表します。 \xhh 16 進コードで hh の文字を表します。 \v 垂直タブを表します。 \b バックスペースを表します。 \e エスケープ文字を表します。 \nnn 16 進コードで nnn の文字を表します。 \M-x メタ文字(x|0x80)、x は任意の文字を指定します。 \M-\C-x メタ制御文字、x は任意の文字を指定します。 \uHHHH ユニコード文字 (HHHH の16進数4桁)を表します。 \u{HHHHHH HHHHHH ....} ユニコード文字列 、HHHHHH は16進数1桁から6桁まで指定可能です。
・任意の1文字 '.'(ドット)で対象文字列の任意の1文字に該当します。
・文字クラスの省略記号 文字クラスとは'[]'(角カッコ) で括った1つ以上の文字を列挙したものです。文字クラスの省略記号は以下の記法が挙げられます。 \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]を表します。
・Unicode文字 Unicodeで規定されている次のプロパティコードが指定可能です。 \p{property-name} \p{^property-name}(否定を意味します) \P{property-name}(否定を意味します)
・POSIX文字クラス UnicodeプロパティでPOSIX文字クラスが利用できます。
・特殊な文字列の表記 \R 改行(CR LF)を表します。 \X Unicode結合文字シーケンスを表します。
・繰り返し(量指定子) {n} ちょうどn回、nは任意の数字を指定します。 {n,} n回以上、nは任意の数字を指定します。 {,m} m回以下、mは任意の数字を指定します。 {n,m} n回以上m回以下、nおよびmは任意の数字を指定します。 * 0回以上の繰り返しで、{0,} と同じ意味となります。 + 1回以上の繰り返しで、{1,} と同じ意味となります。 ? 直前の文字を0回または1回繰り返しで、{0,1} と同じ意味となります。
・繰り返し(最小量指定子) 以下は最短の文字列にマッチします。 {n,}? n回以上の最短文字列、nは任意の数字を指定します。 {,m}? m回以下の最短文字列、mは任意の数字を指定します。 {n,m}? n回以上m回以の最短文字列下、nおよびmは任意の数字を指定します。 *? 0回以上の最短文字列を意味します。 +? 1回以上の最短文字列を意味します。 ?? 直前の文字を0回または1回の最短文字列を意味します。
・繰り返し(絶対最大量指定子) 以下は最長の文字列にマッチします。 *+ 0回以上の最長文字列を意味します。 ++ 1回以上の最長文字列を意味します。 ?+ 直前の文字を0回または1回の最長文字列を意味します。
・キャプチャ '()'(丸カッコ)で括られたパターンで、選択肢の範囲を指定します。 ・部分式呼び出し \g<部分名> あるいは \g'部分名' で、部分名と名付けられた部分正規表現を照合します。 ・選択 '|'(パイプ)で文字列の選択子を設定します。
・アンカー ^ 対象文字列の先頭を表します。 $ 対象文字列の最後を表します。 \A 文字列の先頭を表します。 \Z 開業直前の文字列の最後を表します。 \z 文字列の最後を表します。 \b 単語の境界を表します。 \B 非単語の境界、\bにマッチしない位置を表します。
・先読みと後読み '?='は肯定の先読み、'?!'は否定の先読みを表します。 '?<='は肯定の後読み、'?<!'は否定の後読みを表します。
・条件分岐 (?(条件)真パターン)と(?(条件)真パターン|偽パターン)があります。
・コメント '(?#'ではじまり、')'で終わる文字列はコメント文字として処理から除外します。
正規表現をチェックするには?
正規表現が正しく処理されるか確認するには、オンラインのチェッカーを利用するのが良いでしょう。Rubyのチェッカーはネット検索すると提供サイトが表示されます。以下はよく利用されるRubularのサイトです。正規表現のクイックリファレンス付きですので、必要に応じてご確認ください。 参考:Rubular a Ruby regular expression editor
Rubyの正規表現の使い方
Rubyの正規表現は以下のメソッドを用いることで、抽出や置換ができます。 ・汎用の抽出メソッド String#=~ 正規表現によるマッチングで文字列を抽出します。 String#match? 正規表現によるマッチングで文字列を抽出します。
・条件抽出のメソッド String#start_with? 先頭がパターンを表す文字列・正規表現に該当するときtrueを返します。 String#end_with? 末尾がパターンを表す文字列・正規表現に該当するときtrueを返します。 String#pre_match マッチした部分より前の文字列を抽出します($`と同じ)。 String#post_match マッチした部分より後の文字列を抽出します($'と同じ)。
・置換のメソッド String#gsub マッチした部分を指定文字列で全て置き換えます。 String#sub 最初にマッチした部分を指定文字列で置き換えます。
詳細は以降で説明していきます。
=~メソッドを使った抽出方法
=~メソッドはシンプルで使いやすい抽出方法です。 用法: 文字列 =~ 正規表現オブジェクト マッチした先頭0から始まる位置インデックスを返します。 マッチしなかった場合は「nil」(存在しない)を返します。 使用例:=~メソッドを実行し、マッチしたインデックス番号と文字列を表示する p "string" =~ /str/ p $~ p "string" =~ /spring/ p $~ p "This is a pen" =~ /is/ p $~ 実行結果: 0 #<MatchData "str"> nil nil 2 #<MatchData "is">
matchメソッドを使った抽出方法
matchメソッドを使った抽出方法は次の通りです。 用法: 正規表現オブジェクト = Regexp.new("文字列")、または /\w+/ リターンオブジェクト = 正規表現オブジェクト.match("文字列") 使用例:This is a penを3つの要素に分解する ret1, ret2, ret3 = /(This) +(is) +(a pen)/.match("This is a pen").to_a.values_at(1,2,3) p $~ p ret1,ret2,ret3 実行結果: #<MatchData "This is a pen" 1:"This" 2:"is" 3:"a pen"> "This" "is" "a pen"
subやgsubを使った置換方法
subやgsubを使った置換方法は次の通りです。 用法: 文字列.sub(正規表現か文字列, 置き換える文字列) 文字列.gsub(正規表現か文字列, 置き換える文字列) subは最初にヒットした文字列のみを返しますが、gsubは全て置換処理を行います。 使用例:”a pen”を要素に分解し、”my pen”に変更する p "This is a pen".gsub(/(a) +(pen$)/,'my \\2') p $~ 実行結果: "This is my pen" #<MatchData "a pen" 1:"a" 2:"pen">
Rubyの正規表現のメソッドを活用してプログラム開発を効率的に行いましょう
Rubyはオブジェクト指向のスクリプト言語として豊富な正規表現処理がサポートされています。正規表現の考え方とメソッドの理解が深まったら、データ分析等のプログラム開発に利用しましょう。データ抽出・置換の処理が簡単にできますのでおすすめします。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから