last updated:2024/07/31

Hidemaru Q and A

第IV部〜テキスト編集を極める!!
 タグ付き正規表現とは?


タグ付き正規表現とは?

秀丸エディタはVer.3.0以降で「タグ付き正規表現」がサポートされています。 (Ver.3.19までは正規表現エンジンに「JRE32.DLL」が使用されていましたが、Ver.4.00以降は「HMJRE.DLL」に変更)

秀丸エディタ Ver.3.0〜Ver.4.19 ではタグの指定は「秀丸エディタ独自の指定方法(\fを区切り文字で使用する方法)」が使用されていましたが、秀丸エディタVer5.00以降からは正規表現エンジンであるHMJRE.DLLが変更されPrel等で使用されているグルーピング指定である「()」括弧でのタグ指定が可能になっています。 (旧バージョンとの互換性から"\f"を使う方法も指定可能ですが、「HMJRE.DLL」を使用している場合は使わないほうがいいです)

以降の説明は、正規表現エンジンに「HMJRE.DLL」を使用する前提で行います。

タグ付き正規表現により検索でヒットした文字列の一部又は全体を、置換文字列の一部又は全体として利用できるようになりました。ただし「正規表現」自体が解らないと、さっぱり意味が通じなくなるので、「タグ付き正規表現」を自在に操りたい人はまず「正規表現」を使いこなせるようにしましょう(^^)。

秀丸エディタがサポートしているタグ付き正規表現の仕様は、秀丸エディタのヘルプの「検索系コマンド」- 「タグ付き正規表現による置換について」に書かれています。以下では、この仕様をもとにして実際の使い方を説明していきます。

【1】実際にはどの様な事が出来るのか?

では実際には、秀丸エディタのタグ付き正規表現を使うと、どんなことができるようになるのでしょうか?
例えば下記のような、今までではマクロを使わないと実現できなかったことが、タグ付き正規表現を使った置換だけで処理できるようになります。

  1. 「A さんと B さんは友達です」を「B さんと A さんは友達です」に変換
  2. 「1999年5月12日」という日付を「5/12/1999」に変換
  3. abc, 123等の英数字から成る文字列と、仮名・漢字による文字列との間に半角のスペースをいれる
  4. 「abc」を『abc』というように括弧の種類を変える。
  5. ある種のデータが何行かおきで一纏まりとなっている物を1行 1レコードにし、表計算やデータベースで使いやすいよう整形する。
  6. 行頭のコメント文字を1組だけ削除する

次に、1.の例を使って、実際にタグ付き正規表現を使う時のルールを説明します。

【2】タグ指定の方法

秀丸エディタでタグ付き正規表現を使う場合には、どの部分を置換後の文字列として取り出すかを指定しなければ成りません。
文字列の指定には、()」括弧、正規表現のグルーピングを用います。

たとえば (1)の場合、置換後の文字列で利用したいのは、「A」「B」の部分ですので、検索文字列を

(.+)さんと(.+)さんは友達です

とすれば良いです。

【3】検索元文字列の取り出し

次にとり出した文字列の利用方法です。取り出した文字列は、検索文字列中の「()」括弧で囲まれた部分を前から、「\1」「\2」「\3」.....で利用できます。

  • 「\1」 の形式では1~9 まで指定できます。「\10」 とすると、"\1""0" と認識します。
  • 「\g{1}」 の形式では1~15 まで指定できます。マイナスを指定すると現在位置からの相対位置になります。 \g{-1} だと1個前のグループを指定する事になる。

先ほどの 1. の例では、

タグ番号の割り当て
(.+) さんと (.+) さんは友達です
 
\1 \2

となります。つまり 1. の置換作業は、実際には

検索文字列:  (.+)さんと(.+)さんは友達です
置換文字列:  \2さんと\1さんは友達です

とすれば良いです。

ただし正規表現では「最長一致」の原則があるので、「Aさんと Bさんは友達です。C さんと Dさんは友達です」と続けて同じ表現がある場合、「」の中身全体にヒットしてしまいます。
この様な場合、人の氏名に「。、」が使われないことを利用して、検索文字列を

([^。、]+)さんと([^。、]+)さんは友達です

等とすると良いでしょう。

【4】タグ付き正規表現の使用例

では、タグ付き正規表現を使って、上記の 2. 〜 5.の例も処理してみましょう。

2.「1999年5月12日」という日付を「5/12/1999」に変換したい場合
検索文字列:([0-2]\d\d\d)年(1[0-2]|[0-9])月(3[0-1]|[1-2]?\d)日
置換文字列:\2/\3/\1
3. abc, 123等の英数字から成る文字列と、仮名・漢字による文字列との間に半角のスペースをいれたい場合
検索文字列:([。-゚ぁ-んァ-ヶ亜-黑])([0-9a-z]+)
置換文字列:\1 \2

検索文字列:([0-9a-z\]+)([。-゚ぁ-んァ-ヶ亜-黑])
置換文字列:\1 \2

の 2 回に別けてやると良いです。 1回でやる方法もありますが、指定方法が面倒になります(実際には[]で挟む文字列の中に「^」を使って、仮名・漢字以外の全ても文字列を指定し、メタキャラクタ「?」も合わせて利用します)。

 一瞬

検索文字列:([。-゚ぁ-んァ-ヶ亜-黑])([0-9a-z]+)([。-゚ぁ-んァ-ヶ亜-黑])
置換文字列:\1 \2 \3

で上手くいくような気がしますが、「1999年」の様な場合に上手くいきません。これは「1999」の前に仮名・漢字文字列が無いためです。

4.「abc」を『abc』というように括弧の種類を変えたい場合
検索文字列:「([^」]+)」
置換文字列:『\1』
5. ある種のデータが何行かおきに一纏まりとなっている物を1行 1レコードにし、表計算やデータベースで使いやすいよう整形したい場合

この例では、例えば下記のように

aaa
111
あああ
bbb
222
いいい

という内容を

aaa,111,あああ
bbb,222,いいい

の様に、1 行 1レコードの形に直し、表計算やデータベースで使いやすいように整形します。

上記の例のように、変換元データが3行にわたっているときに、カンマを区切り文字として1行に変換するには、下記のように検索文字列を設定します。

検索文字列:^(.+)\n(.+)\n(.+)$
置換文字列:\1,\2,\3

 一纏まりとなるデータの行数が多い場合、更に多くなる分「(.+)\n」の記述が必要です。
 またデータの中に「,」が含まれている場合を顧慮していませんので注意してください。

6. 行頭のコメント文字を1組だけ削除する

////

という行があったとして、行頭の// を1組だけ省きたいと考えて、正規表現をONにして、検索文字欄に ^// を指定し、置換文字欄を空欄にしたまま置換を行うと、////が全て消えてしまい期待通りの動作をしてくれません。本当は、

//

というふうになってほしいところですが。

これは、「置換の前に確認」をONにして実行するとわかりますが、始めに//// の先頭2文字にヒットして削除され、//となるので、次にこの2文字にヒットしてこれも削除されてしまいます。

この場合、下記のようにタグ付き正規表現を使うとうまく処理できます。

検索文字列:^//(.?)
置換文字列:\1

その他に、hmjre.dll独自の記法ですが、"ヒットした扱いにするタグ指定 (?\tag-number)"という物もあります。これは、正規表現中の一部分のみマッチさせたい場合に使用します。

検索文字列:秀丸(エディタ)(?\1)

これで、"秀丸"が前にある"エディタ"が検索可能です。本来は、"秀丸エディタ"にヒットしますが、 (?\1)で、"\1"に当たる"エディタ"のみ、ヒットさせるように指示しています。
現状では、"先読み"や"戻り読み"がありますが、これらがサポートされていないバージョンでは、正規表現の一部のみマッチさせるのに使っていました。

【5】タグ指定時の注意点

タグの指定で注意すべきことや参考情報を挙げておきます。

  1. 入れ子になった括弧は、一番外側のみ認識します。

    例えば

    (aaa(bbb)ccc)(ddd)

    という指定をした場合、

    (aaa(bbb)ccc)(ddd)
     ------------ ---
     \1           \2

    と、解釈され(bbb)はタグの対象になりません。

    これは、"\f"と、括弧を使ったタグ指定の整合性をとるための制限になります。 ("\f"では入れ子は表現できない)

  2. タグの最大数は15までです。(Ver8.58で9から15へ変更) 10以上は、\g{10}と記述します。10未満でも同様に\g{1}と記述可能です。

    \10

    と記述しても、"\1"と"0"と認識されるので注意する事。

【補足】\fとグルーピングの違い

  • \f と 括弧によるグルーピングの違いですが、通常使う分には、速度的な違いはわかりません。

    違いがわかるようなデータで置換すると、1〜2割程度、"\f"が遅い結果になります。 (1000行の置換で確認)

  • "\f"を使った場合、検索文字列内でタグの参照ができません。

    例:(..)\1

    上記正規表現は「いろいろ」「やれやれ」等にマッチしますが、"\f"を使った場合は、タグの参照ができないので、

    例:..\f\0

    と記述しても、2文字の後に"0"がある箇所にマッチします。

  • 正規表現が有効で、検索文字列に"\f"が含まれる場合、タグの処理は秀丸エディタ本体が行います。

    検索に"\f"が含まれない場合、括弧によるタグの処理は正規表現DLLで行われます。 "\f"と括弧が混在するタグ指定は出来ません。

    混在した場合は、秀丸エディタ本体で"\f"を処理する都合上、"\f"が優先され括弧でのタグ指定は無視されます。 (グルーピングとしては機能する)


ページトップ 目次に戻る