正規表現のメモ2

今回はアプリごとの正規表現実装方法を見ていきましょう。

■前回の補足

その前に前回、

「正規表現とは決められたルールに従って、あるパターンの文字列を表現する方法」

と言い、それと合わせて「\t」=タブ、「\n」=改行を紹介し「メタ文字を使用してパターンを表現する方法=正規表現だ!」というニュアンスでエントリーを書きましたが、Regular Expression(Riue ちゃんの正規表現講座)などと合わせてもう一度考え直すと、「正規表現」と「正規表現で使用するメタ文字の実装方法」を混同していたような気がします。「正規表現」というのは一般的な方法論で、「正規表現で使用するメタ文字の実装方法」がアプリによって違う、というのが本来の使い方だと思います。

ただWebの正規表現関連ページを見ていると「正規表現=メタ文字を使用したパターン表現」という意味で使われているし、その方が話が通じやすい、ということでウチもこっちの意味で使いたいと思います。…まぁ書いてるうちに意味変わるかもしれませんが。

。oO(だいたいRegular Expressionってのが曖昧なんだよな…。)

■Windows関連系

まずはWindowsのコマンドプロンプト、cmd.exeについて。

  • /* 任意の0文字以上の文字列にマッチ
  • ? 「.」を除く任意の1つの文字にマッチ

以上。う~ん、こりゃ他OSに比べてコマンドシェルが「貧弱ぅぅぅぅ~!」と言われても仕方ないな。cmd.exeでは正規表現と名乗らずワイルドカードと名乗っております。まぁワイルドカード系の正規表現しか実装してないからいいんじゃないかな。

が、検索文字列で正規表現を使える外部コマンド「findstr」はもうちょい詳細な正規表現が使えます。

findstr.exe
正規表現クイック リファレンス:
.            ワイルドカード: 任意の文字
*            繰り返し: ゼロ個以上の直前の文字またはクラス
^            行位置: 行頭
$            行位置: 行末
[class]      文字クラス: セットの任意の 1 文字
[^class]     逆クラス: セット以外の任意の 1 文字
[x-y]        範囲: 指定した範囲の任意の文字
\x           エスケープ: メタ文字 x のリテラル使用
<xyz        単語位置: 単語の先頭
xyz\>        単語位置: 単語の終わり

…早くもcmd.exeとワイルドカードの表記方法が違ってますね。"."と"?"が覚えにくかったのってこのせいか!今度からは意識するので大丈夫だと思いますが。

findstrで正規表現を検索する

copyとxcopyの違いについて

findstr.exeとcmd.exeを比べて疑問に思ったのが、内部コマンドと外部コマンドで使える正規表現が違うんじゃないかってこと。そう思い、copyとxcopy.exeでテストをしてみたけど、結果は変わらず。xcopyでもcmd.exeの正規表現しか使えませんでした。これって

C:\>xcopy c:\test\test?.txt c:\test2\

とかしても「cmd.exeの正規表現ルールで処理→xcopy.exeに丸投げ」されるからなのかな?findstr.exeが詳細な正規表現を使えるのは

findstr "hello[0-9]" test.txt

で、"hello[0-9]"という正規表現文字列をそのままfindstr.exeに投げて、findstr.exe内部で改めて正規表現処理してるから?findstr.exeで検索対象とするファイル名に正規表現が使えないところ(※)を考えると、推測は当たっていそうだ。

○ findstr "hoge[1-3]" C:\scr\test.

× findstr "hoge[1-3]" C:\scr\test[1-3].*

LDAPフィルタでは"/*"しか使えません。使い方は他と同じ。

[XADM] LDP ユーティリティを使用した参照およびクエリ

vbsではかなり詳細な正規表現が使えます。

Clinick’s Clinic on Scripting:正規表現による Visual Basic Scripting Edition (VBScript) の機能強化

これちょっと古いですね。7年前の資料です。もうちょっと新しいものないかな?俺は手元にリファレンス本持ってるからいいけど。

■エディタ系

エディタ系は外部dllによって正規表現を実現しているものが多いみたい、というか以下のエディタは全部そうでした。

秀丸エディタを使いこなす ―正規表現―HmJre.dllで拡張された機能――

TeraPad-FAQ:正規表現での検索/置換に対応してますか?

BREGEXP.DLL(サクラエディタの標準正規表現dll)

多分一長一短あるんだろうけど良く分かりません。とりあえず書式が違うんだろうなぁという理解。書式については

  • perl互換
  • grep系
  • Emacs系
  • jre32.dll系(EmEditor,秀丸,FFFTPで実績あり)

という理解でいいのかな?ここらへんも良く分かってません。正直使うときになったら書式調べればいいじゃん、くらいに考えてます。今はサクラエディタで使われているBREGEXP.EXEがperl互換って事が分かったので(だから改行変換するのに\r\nなんだよなぁ)、がんばって書式マスターしようかなぁと思ってます。

■次回

次はBREGEXP.EXEを使った具体的なテキスト処理の例とかできればいいかなぁと思ってます。書式羅列するだけじゃヘルプと同じだからね。

■メモ

Regular Expression(Riue ちゃんの正規表現講座)
分かりやすいし、読み物としても面白い。

詳説 正規表現 第2版
オライリー・ジャパン
詳説 正規表現 第2版

正規表現の勉強してたら買いたくなってきた。オライリーの本は期待を裏切らないんだよなぁ。高くて分厚いけど。MCPもう一個取ったら自分へのご褒美(笑)に買おうかな。

勉強勉強

Posted by tera