正規表現パターンの中のエスケープ処理

正規表現のパターンの中には任意の文字を記述することができますが、メタ文字と呼ばれる特殊な用途で使用される文字にはエスケープ処理が必要となります。ここでは Ruby で正規表現パターンの中のエスケープ処理を行う方法について解説します。

(Last modified: )

パターンの中のエスケープ処理

エスケープ処理が必要となる文字は次のようなものがあります。

\ * + . ? { } ( ) [ ] ^ $ - | /

これらの文字はパターンの中で使用されると特別な意味を持ちます。そこで単なる文字として扱いたい場合には \ 記号を使ってエスケープ処理を行います。例えば「\」「*」「|」の文字をそれぞれエスケープ処理する場合は次のように記述します。

\\
\*
\|

また「-」については [] の中で使用される場合にだけ特別な意味を持つため、 []の中で使用される時だけエスケープ処理が必要となります。

エスケープシーケンス

正規表現オブジェクトのパターンではバックスラッシュ記法を使ったエスケープシーケンスも記述できます。

\t    タブ
\n    改行
\r    キャリッジリターン
\f    改ページ
\b    バックスペース
\e    エスケープ
\s    空白
\nnn  8 進数表記
\xnn  16 進数表記
\cx   コントロール文字 (x は ASCII 文字)
\C-x  コントロール文字 (x は ASCII 文字)

他にも特別な意味を持つエスケープシーケンスが用意されていますが、必要になった時に随時解説していきます。

escapeメソッドを使ったエスケープ処理

Regexp クラスではメタ文字をエスケープした結果を返してくれるクラスメソッドの escpae が用意されています。

Regexp.escape(string)

引数にメタ文字が含まれる文字列を指定します。 escape メソッドは文字列に含まれるメタ文字の前に \ 記号を挿入したものを返してくれます。例えば Regexp.escape(".")\. を表す文字列 \\. を返します。

escape メソッドで取得した文字列を new メソッド又は compile メソッドの 1 番目の引数に指定して利用します。

Regexp.new(Regexp.escape("a[b]c"))

これは次のように記述した場合と同じです。

Regexp.new("a\\[b\\]c")
/a\[b\]c/

なお escape メソッドのエイリアスとして quote メソッドも用意されています。

Regexp.quote(string[,kcode])

使い方は escape メソッドと同じです。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

puts("変換前:[ab+.c/hp]")
puts("変換後:" + Regexp.escape("[ab+.c/hp]"))
puts()
puts("変換前:/abc?def-ghi")
puts("変換後:" + Regexp.escape("/abc?def-ghi"))

下記のように実行して下さい。

パターンの中のエスケープ処理

-- --

Ruby で正規表現パターンの中のエスケープ処理を行う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。