正 規 表 現
正規表現とは、文字列のパターンを指定する方法です。翻訳者や編集者のように、文字の並びを加工する人にとって、強力でとても便利なツールになります。
「整形・置換」タブで表示される機能は、みな、正規表現で実現されています。そのほとんどは、1行からせいぜい10行程度。これだけで、さまざまな機能を実現することができるのです。
正規表現は、SimplyTermsだけでなく、秀丸などのエディタ、Word・一太郎などのワープロソフトでも使えます。それぞれに微妙な違いがありますが、一つ、覚えれば、他もかなり使えるようになります。
簡単に使えるように、ヘルプにガイドをつけるとともに、SimplyTermsに正規表現ファイル作成ツールを組み込んであります。これを機会に、ぜひ、覚えてください。
正規表現ファイルの注意点
SimplyTerms用に正規表現ファイルを作る場合、以下の点に注意してください。
ファイル名 | ファイル名は、「〜_reg.txt」と、必ず、最後を「_reg.txt」にする。 (正規表現ファイル作成ツールから保存すると、自動的にこのようになります) |
作成した正規表現 ファイルの使い方 |
・用語集と同じように使う ・ユーザ定義機能として登録して使う |
ユーザ定義機能 | ユーザ定義機能用の正規表現ファイルについては、SimplyTerms用の拡張があります。詳しくは、正規表現ファイル作成ツールを参照してください。 |
エラー | 文法的に誤った正規表現を指定すると、SimplyTermsがエラーで止まることがあります。指定した正規表現をよく見直してください。 一番よくあるミスは、2バイト文字(日本語など)を検索側に使っているのに、最後のオプション指定に "k" を入れ忘れているというものでしょう。"k"がないと、すべて1バイト文字とみなされ、見た目と違う文字として処理されますから、「"(" と ")" の数が合わない」(目で見ると合っている)とか、「不正な文字がある」など、一見、わけのわからないエラーが返ってきます。 正規表現ファイル作成ツールで、ステップ実行させると、どの行でエラーになっているのか、簡単に確認できます。 |
入門
正規表現は、とっつきにくいとか難しいと言われます。そんなことはありません。このページにあることをざっと読んだら、よく使う正規表現パターンにある実例を使って実験してみてください。「こんなに簡単だったんだ」と、驚かれることでしょう。
全体の構成
正規表現は、大きくわけて3種類のコマンドに分かれます。
m/検索パターン/修飾子
検索パターンで指定したパターンを検索し、マッチした文字列を返します。
ハイライトリストや抽出リストは、このコマンドでできています。
s/検索パターン/置換パターン/修飾子
検索パターンで指定したパターンを検索し、置換パターンに置換します。もっともよく使うパターンとなるでしょう。
tr/検索文字列/検索文字列に対応する置換文字列/修飾子
一対一対応になっている検索文字列と置換文字列を使い、文字単位で対応するものに置換します。
正規表現 | 置換例 |
tr/あいうえお/アイウエオ/ | あ→ア い→イ う→ウ え→エ お→オ 「朝のあいさつ」→「朝のアイさつ」 |
文字パターン
◎基本……文字をそのまま入力
検索・置換したい文字をそのまま入力します。「あ」を「ア」にしたいなら、下記のようにします。(修飾子は後述)
◎メタ文字……"."
"."(半角ピリオド)は、改行以外のあらゆる文字にマッチします。下記の例では、「あいう」も「あかう」も「あaう」も、すべて、「アイウ」に置換されます。
◎繰り返しメタ文字……"?、*、+、*?、+?"
直前の正規表現を繰り返す回数を指定します。指定回数は、以下のとおりです。
メタ文字 | 意味 | 実例 | マッチ内容 |
? | 0 or 1 回 | m/あい?/k | 「あ」「あい」 |
* | 0 回以上 | m/あい*/k | 「あ」「あい」「あいい」「あいいい」…… |
+ | 1 回以上 | m/あい+/k | 「あい」「あいい」「あいいい」…… |
*? | 0 回以上の最短 | m/あい*?/k | 「あいいいい」に適用すると「あい」 「あうううう」に適用すると「あ」 |
+? | 1 回以上の最短 | m/あい+?/k | 「あいいいい」に適用すると「あい」 |
◎文字リスト……"[ ]、^、-"
[ ]を使うと、文字リストが指定できます。
使い方 | 実例 | マッチ内容 |
文字を列挙すると、そのいずれかにマッチする | m/[あいう]/k | あ」「い」「う」 |
"[範囲の始め-範囲の終わり]"で範囲指定(文字コード順) | m/[あ-う]/k | 「あ」「い」「う」 |
"[^文字リスト]"で文字リスト以外 | m/[^あ-う]/k | (「あ」「い」「う」)以外のすべて |
注意)……特にPerl5に慣れている方
[ ]の中にメタ文字が入るときは、必ず\でエスケープしてください("."のみは例外でエスケープ不要。エスケープしてもかまいません)。s/コマンドなどに使われる"/"などもエスケープが必要です。Perl5では不要なので、慣れている人ほど忘れがちです。
◎エスケープ用メタ文字……"\"
特殊な意味を持つメタ文字の前につけて、ふつうの文字と同じ意味にします。たとえば、"["を検索したければ、m/\[/ とするわけです。この"\"を忘れると、「[]の数が合わない」と正規表現ルーチンから怒られます。
実例 | マッチ内容 |
m/[\)\-\/\\]/k | 「)」「-」「/」「\」 |
◎特殊文字……"\t、\r、\n"
普通に入力できない文字です。
特殊文字 | 意味 |
\t | タブ |
\r | 復帰(Cr) |
\n | 改行(Lf) |
注意)……特にPerl5に慣れている方
改行を指定するには、必ず "\r\n" としてください。
Perl5や秀丸などでは、改行を "\n" で表しますが、SimplyTermsでは "\r\n" となります。正規表現の処理に使っているBRegExp.dllではCrとLfが区別されるため、Windowsフォーマットのテキストファイル(改行がCrLf)を取り扱うためには "\r\n" とする必要があるのです。
実例 | 意味 |
s/\t+\r\n/\r\n/kg | 改行直前にタブがあったら削除する |
修飾子
最後につける修飾子は、正規マッチや置換置換のオプションを指定するものです。指定順は順不同です。
修飾子 | 意味 | 実例 | 意味 |
k | 日本語処理で必須 "k"を指定すると、文字列を日本語(SJIS)とみなして処理します。日本語の処理では必ず指定すべき修飾子です。"k"がないと、すべて1バイト文字とみなして処理します。 |
m/チーム/k s/ティーム/チーム/k tr/ーー/--/k |
kがないと、「ー」(音引き)部分でエラーになる |
g | グローバル置換 "g"を指定すると、全体を検索し、マッチした部分のすべてを置換します。"g"の指定がないと、最初にマッチしたところを1回、置換して終了します。 |
||
s/あ/ア/kg | 文書中のすべての「あ」を「ア」に置換。 「あいう。あいう」→ 「アいう。アいう」 |
||
s/あ/ア/k | 最初の「あ」だけを「ア」に置換。 | ||
tr/あいう/アイウ/kg | 全置換。 「あいういあ。あいうえお」→ 「アイウイア。アイウえお」 |
||
tr/あいう/アイウ/k | 最初だけ置換。 「あいういあ。あいうえお」→ 「アいういあ。あいうえお」 |
||
i | 大文字小文字を無視 "i"を指定すると、大文字と小文字を同一視します。半角アルファベットにのみ適用されます。"i"がないと、大文字と小文字は別物と判断されます。 |
||
s/word/単語/g | "word"は置換されるが、"Word"は置換されない | ||
s/word/単語/gi | "word"、"Word"、"WORD"など、すべて置換される |
ステップアップ
入門編だけでも、かなりのことができます。でも、ちょっとややこしいことをしたいときには、もう少し、正規表現を覚える必要があります。
全体の構成
"m//"、"s///"、"tr///"では、"/"の代わりに任意の半角記号が使えます。
たとえば、検索文字列中に"/"が何度も出てくる場合、いちいち"\"でエスケープするのは面倒です。そういうときは、下記のようにすると簡単です。
文字パターン
◎パターンをグループ化する……"( )"
"( )" で囲むと、囲まれた部分がグループになります。
実例 | マッチ内容 |
m/(あいう)+abc/k | 「あいうabc」「あいうあいうabc」……にマッチ SimplyTermsのハイライト表示では、「あいう」「あいうあいう」……がハイライトになる。 |
◎複数の正規表現を並記する……"|"
"|" で仕切られた正規表現は、その両側について OR 検索が行われます。"( )" の中で使うことがよくあります。
実例 | マッチ内容 |
s/あいう|アイウ/ABC/kg | 「あいう」と「アイウ」の両方が"ABC"に置換される |
s/(あ|いう)かきく//kg | 「あかきく」と「いうかきく」が削除される |
◎前の正規マッチを参照する……"$1、$2、$3……"
"$1、$2、$3……"を使うと、検索文字列内の "()" で囲まれた部分を、置換文字列側で参照することができます。"()" で囲まれた部分にマッチしたところを左から数えて、最初が$1、2番目が$2という具合です。
実例 | マッチ内容 |
s/([!-~]) +([、-熙])/$1$2/kg | 「abc あいう」→「abcあいう」と半角スペースがとれる |
◎行頭にマッチする……"^"
正規表現の最初に "^" を書くと、行の最初にマッチします。同じ文字("^")が、[] で囲まれたときと異なる意味を表すので、注意してください。
実例 | マッチ内容 |
s/^あ/ア/km | 行の最初の「あ」のみ「ア」に置換 修飾子 "m" の有無で動作が変わる。"m" については後述。 |
◎行末にマッチする……"$"→使用しないこと。代わりに"\r\n"を指定する。
正規表現の最後に "$" を書くと、行の最後にマッチすることになっています。ただし、"$"の使用には注意が必要です。なるべく使わないほうがいいでしょう。代わりに、"\r\n" とすることをお勧めします。
Windowsテキストでは、改行が"\r\n"(CrLf)となっています。正規表現の処理に使っているBRegExp.dllはCrとLfを区別しており、"$"を「\n(Lf)の前まで」と解釈します。そのため、Windowsフォーマットのテキストファイルでは"\r"まで指定した上で"$"を使わないと行末にヒットしません。
この辺りがきちんと理解できていれば、"$"も使うことができますが、それよりも、"\r\n"を指定してしまったほうが普通は簡単でしょう。
実例 | マッチ内容 |
s/abc\r\n/\r\n/kg | 行末に"abc"という単語があると削除される (このパターンを使うことをお勧めします) |
s/abc\r$/\r/kg | 行末に"abc"という単語があると削除される |
s/abc\r$//kg | 行末に"abc"という単語があると削除されるが、改行コードが変化するのでトラブることがある |
s/abc$//kg | 何も置換されない(行末に"abc"という単語があっても削除されない→けっこうハマります) |
◎エスケープシーケンス……"\b"
単語の区切りにマッチします。
実例 | マッチ内容 |
s/\bword\b/単語/ki | "word"や"Word"は置換されるが"words"は置換されない。"Longword"は置換されないが、"Long-word"は「Long-単語」になる。 |
修飾子
◎"m"……文字列を複数行として扱う(メタ文字^の処理結果に影響を及ぼします)
"m" を指定すると、検索するドキュメント全体を複数行として取り扱います。
"m" がないと、ドキュメント全体は一つの行だ(改行文字を含む)とみなされます。
"m" はなるべく指定しておくことをお勧めします。処理速度が速くなります。
動作が違うケース | 実例 | マッチ内容 |
メタ文字 "^" によって行頭を指定 | ||
s/^ //kg (^の次は全角スペース) |
ドキュメントの最初の全角スペースだけ削除 | |
s/^ //kgm (^の次は全角スペース) |
各行の最初の全角スペースをすべて削除 | |
"\r\n"を複数、用いた正規表現 | ||
s/(\r\n)(\r\n)+/\r\n/kg | 連続する改行を1つだけにする | |
s/(\r\n)(\r\n)+/\r\n/kgm | マッチするところがなく、何の処理も行われない |
SimplyTerms独自拡張機能
◎すべてを置換するまでくり返し置換する……"Loop〜EndLoop"
ある正規表現にマッチするすべてを置換する場合、普通は"g"オプションを指定します。しかし、この指定だけではすべてを置換できないケースがあります。そのような場合、すべてを指定したい正規表現の前後を"Loop"と"EndLoop"(大文字・小文字いずれも可)で囲みます。
実例)△と▽に挟まれた部分にある"a"を、すべて大文字にする場合を考えます。
元テキスト | 得たい結果 | ||
abcde△aabbccaa▽ fghij△bbccaadd▽ |
abcde△AAbbccAA▽ fghij△bbccAAdd▽ |
||
適用する正規表現 | 元テキスト | 得られる結果 | |
s/△(.*)a(.*)▽/△$1A$2▽/kgm | abcde△aabbccaa▽ fghij△bbccaadd▽ |
abcde△Aabbccaa▽ fghij△bbccAadd▽ |
小文字のaが残ってしまう |
Loop s/△(.*)a(.*)▽/△$1A$2▽/kgm EndLoop |
abcde△aabbccaa▽ fghij△bbccaadd▽ |
abcde△AAbbccAA▽ fghij△bbccAAdd▽ |
|
Loop s/△(.*)a(.*)▽/△$1A$2▽/kgmi EndLoop |
abcde△aabbccaa▽ fghij△bbccaadd▽ |
abcde△AAbbccAA▽ fghij△bbccAAdd▽ |
"i"オプション→大文字になった"A"も置換されるため無限ループに陥る |
"Loop〜EndLoop"の仕様
"Loop〜EndLoop"は、大文字・小文字いずれで記述しても同じです。
ループ内には複数の正規表現を書くことができます。複数の正規表現があると、その1つでも置換している間はループし続けます。
ループは、ネストできます。つまり、ループの内側に別のループを組み込むことができます。ネストの深さは、実用上、無制限と考えてかまいません(約20億かメモリ量の限界か、いずれか早くきたほうが限界になります)。
ループ内の正規置換は、くり返した結果、置換しなくなる形に書いてください。必ず置換する表現があると無限ループになります。
よく使う正規表現のリスト
全体パターン | |
---|---|
m/検索パターン/ki | 正規マッチ |
s/検索パターン/置換パターン/kgmi | 正規置換 |
tr/検索文字列/1対1対応する置換文字列/kgmi | 一対一対応で置換 |
|
|
SimplyTerms独自拡張 | |
---|---|
Loop〜EndLoop | この間に挟まれた正規置換で置換するところがなくなるまでループする |
よく使うパターン
[ ]で囲み、リストとして指定する文字パターンで、よく使うものをリストアップしています。これらと繰り返しを表す数量子(?、*、+、*?、+?)が使えれば、ほとんどのパターンが作れます。
全 角 | 半 角 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
全リスト
SimplyTermsでは、BRegExp.dllという正規表現処理用DLLを使って正規表現処理を行っています。BRegExp.dllで使える正規表現は、以下のとおりです。ほぼ、Perl5互換ですが、若干、異なる部分があるようです。
リストは、BRegExp.dllの作者がウェブで紹介していたものと、私が動作確認をしたものを合わせてあります。私自身、どういう動作なのか理解できておらず、動作確認もしていない機能でも、BRegExp.dllの作者がウェブで紹介していたものはリストに入れてあります(注:という書き方でメモが入れてあります)。どのような動作になるのか、理解して確認された方は、お知らせいただけると幸いです。
リスト中の表現は、基本的に、BRegExp.dllの作者が書かれた表現を使っています。SimplyTermsのヘルプの他の部分では、より分かりやすいと私が思った書き方に変えてあります。
注意点
正規表現はPerl5相当ですが、若干の違いがあります。主な相違点は次のとおりです。
全体パターン | |
---|---|
kオプション | 2バイト文字(日本語など)を使うときに必要なオプションです。 |
文字リスト"[ ]"内のエスケープ | [ ]の中にメタ文字が入るときは、必ず\でエスケープしてください。s/コマンドなどに使われる"/"などもエスケープが必要です。Perl5では不要なので、慣れている人ほど忘れがちです。 |
改行記号・行末指定 |
改行記号は "\r\n" となります。Perl5や秀丸などの "\n" とは異なります。 このため、複数行オプション("m")をつけたとき、"$"によって行末を指定したつもりがヒットしないということがよくおきます。"$"ではなく、"\r\n"によって行末を表現するようにしてください。 |
パターンについて
正規表現は、文字列をパターンとして処理します。パターンは、次のように"/"で囲んで指定します。
全体パターン | |
---|---|
m/検索パターン/ki | 正規マッチ |
s/検索パターン/置換パターン/kgmi | 正規置換 |
tr/検索文字列/1対1対応する置換文字列/kgmi | 一対一対応で置換 |
パターン文字に"/"を含む場合は、次のように別の文字を使うと、いちいち\でエスケープせずにすむので便利です。
m#パターン#修飾子
パターンの中にはメタ文字という特別の意味を持つ文字があります。このメタ文字をマスターすると正規表現のパワーを実感できます。 Bregexp ライブラリで使えるメタ文字とその意味は、Perl5とほぼ同じです(若干、違いがあります)。従ってPerl5での正規表現をそのままBregexp ライブラリのパターンとして使えます。次にBregexp ライブラリで使えるメタ文字を示します。
全リスト
|
|