第IV部〜テキスト編集を極める!!
|
●タグ付き正規表現とは?
秀丸の Ver.3.0 で「タグ付き正規表現」がサポートされる事になりました。
これにより検索でヒットした文字列の一部又は全体を、置換文字列の一部又は全体として利用できるようになりました。ただし「正規表現」自体が解らないと、さっぱり意味が通じなくなるので、「タグ付き正規表現」を自在に操りたい人はまず「正規表現」を使いこなせるようにしましょう(^^)。秀丸がサポートしているタグ付き正規表現の仕様は、秀丸エディタのヘルプの「検索系コマンド」−「タグ付き正規表現による置換について」に書かれています。
以下では、この仕様をもとにして実際の使い方を説明していきます。【1】 実際にはどの様な事が出来るのか?
【2】 区切り記号の入れ方
【3】 検索元文字列の取り出し
【4】 タグ付き正規表現の使用例
【5】 \fを入れるルールとトピック
【1】実際にはどの様な事が出来るのか?
では実際には、秀丸のタグ付き正規表現を使うと、どんなことができるようになるのでしょうか?。
例えば下記のような、今までではマクロを使わないと実現できなかったことが、タグ付き正規表現を使った置換だけで処理できるようになります。
- 「A さんと B さんは友達です」を「B さんと A さんは友達です」に変換
- 「1999年5月12日」という日付を「5/12/1999」に変換
- abc, 123 等の英数字から成る文字列と、仮名・漢字による文字列との間に半角のスペースをいれる
- 「abc」を『abc』というように括弧の種類を変える。
- ある種のデータが何行かおきに一纏まりになっている物を、1 行 1 レコードの形に直し、表計算やデータベースで使いやすいように整形する。
- 行頭のコメント文字を1組だけ削除する
次に、(1)の例を使って、実際にタグ付き正規表現を使う時のルールを説明します。
【2】区切り記号の入れ方
秀丸でタグ付き正規表現を使う場合には、どの部分を置換後の文字列として取り出すかを指定しなければ成りません。
そう言った文字列の区切りに、秀丸では「\f」を用います。原則的には取り出す文字列として、利用する部分を「\f」で挟んでやります。但し取り出す文字列が先頭、若しくは最後にある場合も、最初又は最後の「\f」は要りません。たとえば (1) の場合、置換後の文字列で利用したいのは、「A」「B」の部分ですので、検索文字列を
.+\fさんと\f.+\fさんは友達ですとすれば良いです。
【3】検索元文字列の取り出し
次にとり出した文字列の利用方法です。取り出した文字列は、検索文字列中の「\f」で区切られた部分を前から、「\0」「\1」「\2」「\3」..... で利用できます。先ほどの (1) の例では、
.+ \f さんと \f .+ \f さんは友達です ^^ ^^^^^^ ^^ ^^^^^^^^^^^^^^ ↑ ↑ ↑ ↑ \0 \1 \2 \3 となります。つまり (1) の置換作業は、実際には
検索文字列: .+\fさんと\f.+\fさんは友達です 置換文字列: \2さんと\0さんは友達です
または
\2\1\0\3とすれば良いです。
ただし秀丸の正規表現では「最長一致」の原則があるので、「A さんと Bさんは友達です。C さんと D さんは友達です」と続けて同じ表現がある場合、「」の中身全体にヒットしてしまいます。
この様な場合、人の氏名に「。、」が使われないことを利用して、検索文字列を[^。、]\fさんと\f[^。、]+\fさんは友達です等とすると良いでしょう。
【4】タグ付き正規表現の使用例
では、タグ付き正規表現を使って、上記の 2. 〜 5. の例も処理してみましょう。2.「1999年5月12日」という日付を「5/12/1999」に変換したい場合
検索文字列: [0-2][0-9][0-9][0-9]\f年\f(1[0-2]|[0-9])\f月\f(3[0-1]|[1-2]?[0-9])\f日 置換文字列: \2/\4/\0 3. abc, 123 等の英数字から成る文字列と、仮名・漢字による文字列との間に半角のスペースをいれたい場合
検索文字列: [。-゚ぁ-んァ-ヶ亜-K]\f[0-9a-z]+ 置換文字列: \0 \1 と
検索文字列: [0-9a-z]+\f[。-゚ぁ-んァ-ヶ亜-K] 置換文字列: \0 \1 の 2 回に別けてやると良いです。1 回でやる方法もありますが、指定方法が面倒になります (実際には[]で挟む文字列の中に「^」を使って、仮名・漢字以外の全ても文字列を指定し、メタキャラクタ「?」も合わせて利用します。)。
一瞬
検索文字列: [。-゚ぁ-んァ-ヶ亜-K]\f[0-9a-z]+\f[。-゚ぁ-んァ-ヶ亜-K] 置換文字列: \0 \1 \2 で上手くいくような気がしますが、「1999年」の様な場合に上手くいきません。これは「1999」の前に仮名・漢字文字列が無いためです。
4.「abc」を『abc』というように括弧の種類を変えたい場合
検索文字列: 「\f[^」]+\f」 置換文字列: 『\1』 5. ある種のデータが何行かおきに一纏まりになっている物を、1 行 1 レコードの形に直し、表計算やデータベースで使いやすいように整形したい場合
この例では、例えば下記のように
aaa
111
あああ
bbb
222
いいいという内容を
aaa,111,あああ
bbb,222,いいいの様に、1 行 1 レコードの形に直し、表計算やデータベースで使いやすいように整形します。
上記の例のように、変換元データが3行にわたっているときに、カンマを区切り文字として1行に変換するには、下記のように検索文字列を設定します。
検索文字列: ^.+\f\n\f.+\f\n\f.+$ 置換文字列: \0,\2,\4 一纏まりとなるデータの行数が多い場合、更に多くなる分「.+\f\n」の記述が必要です。
またデータの中に「,」が含まれている場合を顧慮していませんので注意してください。6. 行頭のコメント文字を1組だけ削除する
//// という行があったとして、行頭の// を1組だけ省きたいと考えて、正規表現をONにして、検索文字欄に ^// を指定し、置換文字欄を空欄にしたまま置換を行うと、////が全て消えてしまい期待通りの動作をしてくれません。本当は、
// というふうになってほしいところですが。
これは、「置換の前に確認」をONにして実行するとわかりますが、始めに //// の先頭2文字にヒットして削除され、// となるので、次にこの2文字にヒットしてこれも削除されてしまいます。
この場合、下記のようにタグ付き正規表現を使うとうまく処理できます。
検索文字列: ^//\f.? 置換文字列: \1
【5】\fを入れるルールとトピック
最後に注意すべきことや参考情報を挙げておきます。
- 「\f」の記号は、括弧の中に入れてはいけません。括弧の中に入れるとうまく区切り位置の計算ができなくなります。
- また、「\f」での区切りがあいまいになるような表現もいけないです。例えば
検索文字列:「A\f.+\f.+」のように、どうにでも解釈できるような区切り位置は指定しないでください。
- 「*」「?」「+」のように、直前のパターンに対して意味を持つ表現を「\f」の直後に入れることも反則です。
- 秀丸エディタが区切り位置の計算に失敗した場合、「\0」「\1」「\2」... の部分には何も入りません。
- 複数の改行を検索文字列に含む置換を行いたい場合(上記の例(5)のような場合を含む)は、秀丸エディタヘルプの「 \n を使った複数行検索の際の制限について」の内容を理解しておく必要があります。
- \f を伴う replaceup も、制限というか、難しい場合があるそうです。
- grep 関連では \f は無効のようです。
searchdown "^.+\\n\\f.+\\n\\f.+\\n", regular; // OK !!!
localgrep "^.+\\n\\f.+\\n\\f.+\\n", regular; // NG ???
localgrep ".+\\n\\f.+\\n\\f.+\\n", regular; // NG !!!
- 秀丸 ver.3.01現在のバグで、正規表現を使う場合に \f という文字列を検索できないというのがありました。(ver.3.02以降では修正されています。)
ver.3.01でも動作させるためには、次のように書くとできます。
- 検索ダイアログ(正規表現 ON の時):
検索文字列:(\\)f- マクロ:
searchdown "(\\\\)f", regular;※この内容は秀丸エディタ ver.3.08の内容を元に書かれています。
今後のバージョンアップによっては、上記の内容が必ずしも当てはまらない場合もあるかもしれません。