last updated:2021/08/02

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 \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とグルーピングの違い


目次に戻る