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

広告

パターンの中には任意の文字を記述することが出来ますが、メタ文字と呼ばれる特殊な用途で使用される文字にはエスケープ処理が必要となります。

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

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

¥¥
¥*
¥|

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

エスケープシーケンス

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

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

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

Regexp.escape(string[,kcode])

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

Regexp.escape(string[,kcode])

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

2番目の引数には文字コードを指定します(省略可能)。指定可能な値は以下のいずれかの文字列です。

"N" or "n"    # None
"E" or "e"    # EUC-JP
"S" or "s"    # Shift_JIS
"U" or "y"    # UTF-8

省略された場合は「$KCODE」に設定された値が使用されます。

「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」メソッドと同じです。

サンプルプログラム

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

test5-1.rb

#! ruby -Ku
require "kconv"

print(Kconv.tosjis("変換前:[ab+.c/hp]¥n"))
print(Kconv.tosjis("変換後:") + Regexp.escape("[ab+.c/hp]") + "¥n")
print("¥n")
print(Kconv.tosjis("変換前:/abc?def-ghi¥n"))
print(Kconv.tosjis("変換後:") + Regexp.escape("/abc?def-ghi") + "¥n")

上記のプログラムを「test5-1.rb」として保存します。文字コードはUTF-8です。そして下記のように実行して下さい。

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

( Written by Tatsuo Ikura )