正 規 表 現

正規表現とは、文字列のパターンを指定する方法です。翻訳者や編集者のように、文字の並びを加工する人にとって、強力でとても便利なツールになります。

「整形・置換」タブで表示される機能は、みな、正規表現で実現されています。そのほとんどは、1行からせいぜい10行程度。これだけで、さまざまな機能を実現することができるのです。

正規表現は、SimplyTermsだけでなく、秀丸などのエディタ、Word・一太郎などのワープロソフトでも使えます。それぞれに微妙な違いがありますが、一つ、覚えれば、他もかなり使えるようになります。

簡単に使えるように、ヘルプにガイドをつけるとともに、SimplyTermsに正規表現ファイル作成ツールを組み込んであります。これを機会に、ぜひ、覚えてください。


正規表現ファイルの注意点

SimplyTerms用に正規表現ファイルを作る場合、以下の点に注意してください。

ファイル名 ファイル名は、「〜_reg.txt」と、必ず、最後を「_reg.txt」にする。
(正規表現ファイル作成ツールから保存すると、自動的にこのようになります)
作成した正規表現
ファイルの使い方
・用語集と同じように使う
・ユーザ定義機能として登録して使う
ユーザ定義機能 ユーザ定義機能用の正規表現ファイルについては、SimplyTerms用の拡張があります。詳しくは、正規表現ファイル作成ツールを参照してください。
エラー 文法的に誤った正規表現を指定すると、SimplyTermsがエラーで止まることがあります。指定した正規表現をよく見直してください。
一番よくあるミスは、2バイト文字(日本語など)を検索側に使っているのに、最後のオプション指定に "k" を入れ忘れているというものでしょう。"k"がないと、すべて1バイト文字とみなされ、見た目と違う文字として処理されますから、「"(" と ")" の数が合わない」(目で見ると合っている)とか、「不正な文字がある」など、一見、わけのわからないエラーが返ってきます。
正規表現ファイル作成ツールで、ステップ実行させると、どの行でエラーになっているのか、簡単に確認できます。

入門

正規表現は、とっつきにくいとか難しいと言われます。そんなことはありません。このページにあることをざっと読んだら、よく使う正規表現パターンにある実例を使って実験してみてください。「こんなに簡単だったんだ」と、驚かれることでしょう。

全体の構成

正規表現は、大きくわけて3種類のコマンドに分かれます。

m/検索パターン/修飾子

検索パターンで指定したパターンを検索し、マッチした文字列を返します。

ハイライトリストや抽出リストは、このコマンドでできています。

s/検索パターン/置換パターン/修飾子

検索パターンで指定したパターンを検索し、置換パターンに置換します。もっともよく使うパターンとなるでしょう。

tr/検索文字列/検索文字列に対応する置換文字列/修飾子

一対一対応になっている検索文字列と置換文字列を使い、文字単位で対応するものに置換します。

正規表現 置換例
tr/あいうえお/アイウエオ/ あ→ア
い→イ
う→ウ
え→エ
お→オ
「朝のあいさつ」→「朝のアイさつ」

文字パターン

◎基本……文字をそのまま入力

検索・置換したい文字をそのまま入力します。「あ」を「ア」にしたいなら、下記のようにします。(修飾子は後述)

s/あ/ア/kg

◎メタ文字……"."

"."(半角ピリオド)は、改行以外のあらゆる文字にマッチします。下記の例では、「あいう」も「あかう」も「あaう」も、すべて、「アイウ」に置換されます。

s/あ.う/アイウ/kg

◎繰り返しメタ文字……"?、*、+、*?、+?"

直前の正規表現を繰り返す回数を指定します。指定回数は、以下のとおりです。

メタ文字意味実例マッチ内容
?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///"では、"/"の代わりに任意の半角記号が使えます。

たとえば、検索文字列中に"/"が何度も出てくる場合、いちいち"\"でエスケープするのは面倒です。そういうときは、下記のようにすると簡単です。

s#abc/123/あいう#ABC/123/アイウ#kg

文字パターン

◎パターンをグループ化する……"( )"

"( )" で囲むと、囲まれた部分がグループになります。

実例マッチ内容
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一対一対応で置換

文字指定
.(改行以外の)すべての文字
\tタブ
\r\nWindowsの改行
\ 次のメタ文字をエスケープする
(特殊な意味を取り消す)

直前の文字の繰り返し回数を指定する数量子
?0 or 1 回
*0 回以上
+1 回以上
*?0 回以上の最短
+?1 回以上の最短

グループ指定など
[ ]文字リスト(or)
( )グループ化(後参照やくり返しで使う)
[^ ][ ]の否定
-範囲指定
|複数並記
$1、$2……後参照
修飾子
k文字を日本語(SJIS)として扱う(Perlにこの修飾子はありません)
m文字列を複数行として扱う(メタ文字^と改行が複数あるとき処理結果が異なる)
g置換のみ有効:グローバルな置換
i大文字小文字を区別しない

m修飾子と一緒に使う
^行の最初にマッチする

SimplyTerms独自拡張
Loop〜EndLoopこの間に挟まれた正規置換で置換するところがなくなるまでループする

よく使うパターン

[ ]で囲み、リストとして指定する文字パターンで、よく使うものをリストアップしています。これらと繰り返しを表す数量子(?、*、+、*?、+?)が使えれば、ほとんどのパターンが作れます。

全 角半 角
全角−和文
[ぁ-ん]ひらがな
[ァ-ヴー]カタカナ
[ぁ-ヴー]ひらがな+全角カタカナ
[亜-熙]漢字
[〇一二三四五六七八九]漢数字
[、-熙]和文文字(全角スペースを除く)
[ -熙]+和文(最初は全角スペース。文全体がマッチする)

全角−英数字
[0-9]全角の数字
[A-Z]全角の大文字
[a-z]全角の小文字
[A-z]全角のアルファベット

その他
[Α-Ω]ギリシャ文字−大文字
[α-ω]ギリシャ文字−小文字
[Α-ω]ギリシャ文字−大文字・小文字
[А-Я]ロシア文字−大文字
[а-я]ロシア文字−小文字
[А-я]ロシア文字−大文字・小文字
[─-╂]罫線記号
[T-]]ローマ数字
[@-S]丸付き数字
半角−和文
[。-・ー゙゚]半角の和文記号
[ヲ-゚]半角カナ
[。-゚]半角和文記号+半角カナ(上記2つを合わせたもの)

半角の英数字
[0-9]数字。\dと同じ
[A-Z]大文字
[a-z]小文字
[A-Za-z]アルファベット
[!-~]欧文文字
[!-/:-@\[-`{-~]欧文記号
[A-Za-z]+欧文単語。[ ]内に[A-Za-z_]と"_"を追加すると、\w+と同じになる
[ -~]+欧文(最初は半角スペース。文全体がマッチする)

全リスト

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 ライブラリで使えるメタ文字を示します。

全リスト

メタ文字
\ 次のメタ文字をエスケープ(クォート)する
(特殊な意味を取り消す)
^
  • 行の最初にマッチする(m修飾子の有無で意味が変化する)
  • [^ ]とすると文字リストの否定になる
.(改行以外の)すべての文字
$行の終わりにマッチする(Windowsテキストでは使わないほうがいい。代わりに\r\nを指定する)
|2つを並記。orを意味する
( )グループ化(後参照やくり返しで使う)
[ ]文字リスト("or"リスト)
[^ ][ ]の否定
-範囲指定
$1、$2
……
後参照。正規表現の前のほうにあるカッコを順番に$1、$2で参照します。置換やくり返しによく使います。


\w単語の構成文字 (英数字と "_") にマッチ
\W単語の構成文字以外にマッチ
\s空白文字にマッチ
\S空白文字以外にマッチ
\d数字にマッチ
\D数字以外にマッチ
\b単語の境界にマッチ
\B単語の境界以外にマッチ
\A文字列の最初にのみマッチ
\Z文字列の最後にのみマッチ
\tタブ
\n改行(Windowsテキストでは、改行として\r\nを指定すること)
\r復帰
\f改ページ
\aアラーム (ベル)
\eエスケープ
\0338 進数で表した文字(例は8進数の33)
\x1b16 進数で表した文字(例は16進数の1b)
\c[コントロール文字(例は[のコントロール文字)
直前の文字の繰り返し回数を指定する数量子
?0 or 1 回
*0 回以上
+1 回以上
*?0 回以上の最短
+?1 回以上の最短
{n}ちょうど n 回にマッチ
{n,}n 回以上にマッチ
{n,m}n 回以上、m回以下にマッチ

修飾子
k文字を日本語(SJIS)として扱う(Perlにこの修飾子はありません
m文字列を複数行として扱う(メタ文字^と改行が複数あるとき処理結果が異なる)
g置換のみ有効:グローバルな置換
i大文字小文字を区別しない
c変換:SEARCHLIST を補集合にする(注:詳細不明)
d変換:見つかったが置換されなかった文字を削除する(注:詳細不明)
e変換:置換された文字が重なったときに圧縮する(注:詳細不明)

SimplyTerms独自拡張
Loop
正規表現
EndLoop
Loop〜EndLoopに挟まれた正規置換で置換するところがなくなるまでループする。Loop〜EndLoopは大文字・小文字関係なし

非互換(Bregexpでは非サポート)
\G前回の m//g が終わったところにのみマッチ
o修飾子一度だけコンパイル(注:SimplyTermsでは不要な機能)
x修飾子拡張正規表現を使用する(注:詳細不明)
e修飾子式の右側の評価を行なう