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

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

(2021 年 06 月 30 日公開 / 2022 年 10 月 10 日更新)

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

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

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

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

\\
\*
\|

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

エスケープシーケンス

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

\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

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。