4. 秀丸エディタの正規表現 

   4−1  秀丸エディタ
   4−2  秀丸エディタで正規表現を用いて検索する
   4−3  正規表現を用いて文字列置換する
   4−4  最長一致の原則


4−1  秀丸エディタ

ここからは、私の使っている 秀丸エディタ を例に話を進めていきたいと思います。他のエディタを使う人は、 話をそのエディタ用に読み替えて下さい。
データには、本サイトで公開している古典作品原文のうち、以下のテキスト
   「竹取物語」… taketori.txt
   「伊勢物語」… ise.txt
   「土佐日記」… tosa.txt
を使おうと思います。
説明を実際に試してみたい方は、この3つのファイル をダウンロードして、どこか適当な場所に置いて下さい。 この節ではDドライブに D:\TEXT というフォルダを作り、 そこにファイルを置いたとして話を進めます。いじったテキストを間違えて保存 してしまうこともあるでしょうから、元のファイルを別の場所にも保管しておいて ください。


◆ 秀丸エディタで使える正規表現◆
メタ文字  意 味

[ ]	例: [abcd]     a b c d のいずれか1文字にマッチ
	   [a-d]      上記に同じ
	   [^abcd]    a b c d 以外の1文字にマッチ
( )	パターンをグループ化する 
 |	パターンの論理和 
	例: (abc|def)ghi … abcghi または defghi にマッチ 
 ^	行頭
 $	行末  例: ^$ と指定すると空行にマッチ
 .	改行を除く任意の1文字
 *	直前のパターンの0回以上の繰り返し
 +	直前のパターンの1回以上の繰り返し
 ?	直前のパターンが0回または1回現われる
 \	エスケープ文字
	  メタ文字を文字として検索したい時付加する
	  例:'?'という字を検索したい時は  \?  と書く

以下は、Hmjre.DLL使用時のみ有効

{n}	 パターンの繰り返し回数指定 n回
{n,}	 パターンの繰り返し回数指定 n回以上
{n,m}	 パターンの繰り返し回数指定 n回以上m回以内
(?=expression) 後方一致指定(V1.50にて一部拡張) 
(?!expression) 後方不一致指定(V1.50にて一部拡張) 
(?<=expression) 前方一致指定 
(?<!expression) 前方不一致指定 
\1・\2 ... 一般的正規表現互換のタグ付き正規表現(V1.50から) 
*?・+?・??・{n,m}? 繰り返しマッチングでのものぐさ指定 
(?\tag-number) ヒットした扱いにするタグ指定(hmJre.dll独自形式) 


特殊な表現が必要な文字(エスケープシークエンス)

\ooo	oに8進数で文字コードを指定する。oは1〜3桁
\xhh	hに16進数で文字コードを指定する。hは1〜2桁
\a	ベル (ASCIIコード7)
\b	バックスペース (ASCIIコード8)
\n	ニューライン (ASCIIコード10)
\r	キャリッジリターン (ASCIIコード13)
\t	水平タブコード (ASCIIコード9)
\v	垂直タブコード (ASCIIコード11)
\f	フォームフィード (ASCIIコード12)
\e	エスケープコード (ASCIIコード27)
\z	エンドオブファイル (EOF:ASCIIコード26)
\<	英単語の始まり
\>	英単語の終わり
\w	英単語
\f	タグつき正規表現の切り分け用
\0,\1,〜 切り分けた部分を置換文字列に指定する時の記号

見ると、前章の Word のワイルドカードとは少しずつ違いますが、こちらの方が 有名どころ(grep, sed, perlなどのテキスト処理言語や多くのエディタ) の正規表現により近い記述方法です。 → 第8章 その他のツールと正規表現


4−2  正規表現を用いて検索する

伊勢物語のテキストから、四段活用の動詞 "給ふ" を検索してみます。 ひらがな表記の "たまふ"、漢字表記の "給ふ"、そしてそれらの 6つの活用形すべて (-は、-ひ、-ふ、-へ)を対象とします。

(1) 秀丸エディタを起動して D:\TEXT\ise.txt を開きます。
(2) 秀丸エディタの検索・置換機能は [検索(S)] という独立したメニューに
   なっています。[検索(S)]-[検索(F)] を実行します。
(3) 現れた窓の中にある「正規表現」をチェックします。

Search

(4) テキストボックスに以下の正規表現を入力して検索を実行します。

「給ふ」のすべての活用を検索
 検索(S):給[はひふへ]
「たまふ」のすべての活用を検索
 検索(S):たま[はひふへ]
両方同時に検索
 検索(S):(たま|給)[はひふへ]
        ※ [はひふへ] は [は-へ] でもOKです。

(5) 最初にマッチしたパターンの所にカーソルが移動します。次の場所を探
   すには、下の候補だったら [F3] 、上の候補だったら [Shift][F3] キー
   を押すと、次の場所へカーソルが移動します。

(6) エディタは文法を解釈しているわけではないので、(4)の検索を行うと、
   "のたまふ"という単語の中の"たまふ"にも当然ヒットします。
   (「のたまふ」は「言ふ」の尊敬語で、「給ふ」とは別の単語です。)
   これを避けたい場合は、

  検索(S):
[^の](たま|給)[はひふへ]   

   とします。このパターンで検索すると、
     ""以外の1字 + "たまふ"
   または
     ""以外の1字 + "給ふ"
   という文字列がヒットします。


4−3 正規表現を用いて文字列置換する

(7) ひらがなの "たまふ" を漢字の "給ふ" に置換してみましょう。
   [検索(S)]-[置換(R)] を実行するのですが、単に "たま""給" に置換
   するだけでは "たま" などまでが "" となってしまうので、

■方法1
   「タグ付き正規表現」で検索→置換を実行します。
   パターンをカッコで括ることで、いくつかの部分に分割します。
   このパターンに一致した検索文字列は、部分ごとに、最も左の部分から
   順に \1 \2 \3 …… \9 という特殊文字へ格納されます。

  検索(S):
([^の])(たま)([はひふへ])  
  置換(E):
 \1給\3

    解説:上記の検索をしてマッチした文字列があると、
      \1 ←「の」以外の1字
      \2 ←「たま」
      \3 ←「は」「ひ」「ふ」「へ」の中のどれか
    が格納されています。

■方法2
   旧バージョンでは、秀丸独自の「タグ付き正規表現」が用意されていました。
   \f という特殊文字が、パターンをいくつかの部分に分割します。
   このパターンに一致した検索文字列は、部分ごとに、最も左の部分から
   順に \0 \1 \2 …… \9 という特殊文字へ格納されます。
   方法1の、カッコを使ったタグと数字がずれるので注意。

  検索(S):
[^の]\fたま\f[はひふへ]  
  置換(E):
 \0給\2

    解説:上記の検索をしてマッチした文字列があると、
      \0 ←「の」以外の1字
      \1 ←「たま」
      \2 ←「は」「ひ」「ふ」「へ」の中のどれか
    が格納されています。


4−4  最長一致の原則

一般に、正規表現の記述には、「最長一致の原則」というものがあります。
竹取物語のテキストから「え〜打消」(不可能の表現) を検索してみましょう。

(1) 秀丸エディタを起動して D:\TEXT\taketori.txt を開きます。
(2) [検索(S)]-[検索(F)] を実行します。
(3) テキストボックスに以下の正規表現を入力して検索を実行します。

 検索(S):
 え.+[ざじずでぬ]     

これで "え見つけ奉らず" "え取らじ" などを検索することが可能なはず。
ところがこのパターンは、下記の赤字部分のような文字列

 この国に見ぬ玉の枝なり。このたびは、いかか辞びまうさむ。

など、文法上の文をまたぐ文字列にも一致してしまいます。コンピュータ自体、 あるいは秀丸エディタ自体は、句点 "" を他の文字と比べて特別視したりは しないということです。
さらには、

「をぢなきことする船人にもあるかな。知ら、かくいふ」と思して、 「わが弓の力は、龍あらば、ふと射殺して、頸の玉は取りてむ。遅く来 る奴ばらを待た。」と宣ひて、船に乗りて、海ごとに歩き給ふに、 いと遠くて、筑紫の方の海に漕ぎいで給ひ

という行を検索すると、「え」から始まる

 "知ら"
 "知らで、かくいふ」と思して、……奴ばらを待た"

といった文字列が存在するにもかかわらず、秀丸はさらにその先までいって、 最後の「」までの文字列と一致しました (打消でなく、完了の「ぬ」なのはご愛嬌です)。

実は、「〜回以上の繰り返し」を含む正規表現は、原則として検索対象の中 で最も長いパターンとまず最初に一致するよう決められているのです。
これを最長一致の原則といいます。
文や句を超えた長い文字列を検索してしまわないためには、パターンを

 検索(S):
 え[^、。」]+[ざじずぬで]    

などとするのがよい方法のひとつです。

逆に、わざと「最も短い」パターンに一致させたいこともあるでしょう。
正規表現が扱えるソフトや言語の中でも、Perlなど一部のものについては、最も短い文字列を一番先に検索する「最短一致」優先パターンを記述することもできます。 詳細は、関係書籍やWebサイトを参照して下さい。
秀丸エディタでは、これを「ものぐさ指定」と呼びます。

 検索(S):
 え*?[ざじずぬで]