2007年7月22日日曜日

JeneViewの正規表現を使用するときの注意点 正規表現編

JaneViewの「NGEx」「ReplaceStr.txt」で扱われる正規表現で躓きそうな部分のまとめです。

大文字/小文字を区別しない

Janeの正規表現は、大文字/小文字を区別しません。

a … 「a」「A」にマッチ
w … 「w」「W」 にマッチ

全角の大文字/小文字も区別しない点に注意してください。正規表現の修飾子 "i" が指定されていると捉えても構いません。

# 個人的には、[大文字/小文字を区別する] オプションが欲しいところです。
w+ は WWW にマッチしてしまうし、ReplaceStr.txt による英字の「全角→半角」変換は先にマッチした方 (小文字 or 大文字) に統一されてしまいます。
この状況を打開する方法は、今のところ存在しないと思います。

WSH有効でより高度な正規表現を使用できる

[設定 -> 設定 -> 基本 -> その他 -> 正規表現にWSHを使う] にチェックを入れることで、チェックを入れないときに使えなかった正規表現を使用できるようになります。

(?:pattern) … 変数にキャプチャせずにグループ化する
(?=pattern) … pattern に一致する文字列を肯定先読み。先読みした文字列は変数にキャプチャしない。
(?!pattern) … pattern に一致する文字列を否定先読み。先読みした文字列は変数にキャプチャしない。

ここに挙げた表現は全て変数にキャプチャしません。(グループ化された部分を変数に記憶せず、 で参照できなくなる)
そのため、メモリを節約できます。

「何だかよくわからない」という人は、先読み 正規表現でGoogle検索してみてください。

# Proxomitronの表現で表すと、(?=pattern) は肯定先読み、(?!pattern) はNOT関数と同等です。

# [正規表現にWSHを使う] にチェックを入れないと、TRegExpr が使用されます。
JaneView.txt によると、「※エラーは出ませんが、TRegExprはあまり複雑な正規表現はパースできないようで特にmigemoで短い文字列を検索した場合にはマッチングがおかしい事があります」とのこと。

キャレット (^) は行頭ではなく、文頭にマッチする

一部の正規表現ライブラリは ^ を指定することで行頭にマッチしますが、Janeの ^ は文頭にマッチします。
特別なことをしなくても、複数行にマッチさせることが可能です。
(dat保存時に改行がbr要素に置換されるため、Janeの内部処理では一行からなるデータを検索していると思われます)

行頭にマッチさせたい場合は、次のように指定します。

(?:^|<br>)

全角文字を文字クラスに含めることが出来る

Janeの正規表現は、全角文字を文字クラスに含めることが出来ます。
ですので、[  ] で「半角空白/全角空白」の両方にマッチさせることが可能です。

Shift_JIS の文字列を検索している

Janeが検索するのは Shift_JIS の文字列です。 このことを覚えておくと、全角文字を文字クラスで範囲指定するときに役立ちます。

例えば、[あ-ん] はどういう文字にマッチするでしょうか。
直感的にはひらがなの「あ~ん」にマッチしそうですが、実際には「ぁぃぅぇぉ」などの拗音にもマッチします。

これは、ひらがなを Shift_JIS の16進数で表されるコードに変換すると、理解しやすいでしょう。

あ … 0x82 0xa0
ぃ … 0x82 0xa1
い … 0x82 0xa2
...
ん … 0x82 0xf1

2つめのコードの末尾の数字を見ると、0, 1, 2 と連番になっていることが分かります。
文字クラスはこれらコードの数値を範囲指定しているのです。
[あ-ん] は 0x82 [0xa0-0xf1] を指定しているともいえます。(実際には、この記述法で指定できません。)

特定の文字のコードを調べるには、次のどれかを使ってください。

「Proxomitron用 文字コード変換」「URLエンコード」は上で紹介したものと書式が違いますが、数値は同じなので参考にすることが出来ます。
例えば、「あ」をエンコードしたとき、それぞれのコードは以下のようになります。(「82, a0」の数値が同じ事が分かると思います)

16進数のShift_JISコード … 0x82 0xa0
Proxomitron用文字コード … [%82][%a0]
URLエンコード … %82%a0

# Proxomitronでは [あ-ん] を [%82][%a0-%f1] と書き表せます。(Shift_JISコードの場合)

# 0xnn がそれぞれ1バイトのコードを示します。
Shift_JISコードにおいては、ひらがな1文字に付き2バイトで表されるので、それぞれ2つ分のコードがあるわけです。
2バイトで1文字を表している文字を2バイト文字といいます。

ReplaceStr で置換した内容に対して、更に置換することが出来る

例えば、次の表現を ReplaceStr.txt に記述すると、

名無し[Tab]ななしだよ
ななしだよ[Tab]名無しという名の名無し

「名無し」は「名無し → ななしだよ → 名無しという名の名無し」という遍歴を経て、「名無しという名の名無し」に置換されます。

# 一度に置換させるより、複数回マッチさせた方が高速に置換する事もあるそうです。

# 特に、全角/半角 の両方に対応したい場合、初めに半角に置換して文字種を統一しておけば、後の表現を書くのが楽になります。

NGEx は ReplaceStr より前に発動する

ReplaceStr で置換した文字列に NGEx でマッチさせることは出来ません。

# NGEx であぼーん(消去)した投稿内容に対して、ReplaceStr が無効なわけではないようです。
レスアンカーであぼーんされたレスを見たり、[Ctrl] + [数字] キー で任意のレス番の投稿内容をポップアップさせると、ReplaceStrが効いていることが分かります。

ラベル: , , ,

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

この投稿へのリンク:

リンクを作成

<< ホーム