|
アドバイスありがとうございます。
実はあの正規表現パターンは、初めからマクロのcolormarkerallfoundで特定のブロ
ック(クラスや関数など)の中の
特定のステートメントだけを強調表示させる意図のものです。
元は、次のようなマクロで正規表現による強調表示を定義していました。
// -------------------------------- hilabc.mac --------------------------------
disablebreak ;
setcompatiblemode (
0x00020000 |
0x00800000
) ;
disabledraw ;
disableinvert ;
// 検索対象の定義。
$tokenDelimiter = @"\s+" ; // 字句の境界は改行、スペースまたはタブ
が必ず存在する。
$methodBegin = @"xx" ; // 仮想的な「関数」の開始字句。
$methodEnd = @"yy" ; // 仮想的な「関数」の終了字句。
$statement = @"[a-z]" ; // 関数内の仮想的な「文」の字句。
$target = @"g" ; // 強調表示させる対象の文。
// 正規表現パターンを組み立てる。HmJre.dll専用。
$searchPattern = (
// 正規表現オプション。
(
@"(?#lookbehind)" +
@"(?#maxlines:50)" +
@"(?#fulllinematch)"
) +
// 検索パターン本文。
(
// 前方一致の条件。
( @"(?<=" +
// まず関数の開始がある。
(
@"(" +
$methodBegin +
@")"
) +
// その後に文が任意個数続く。
(
@"(" +
$tokenDelimiter +
@"(" +
$statement +
@"))*"
) +
//前の文と強調表示させる文との境界。
$tokenDelimiter +
@")" ) +
// 強調表示させる文。
(
@"(" +
$target +
@")"
) +
// 後方一致の条件。
( @"(?=" +
// 強調表示させる文と後の文との境界。
$tokenDelimiter +
// 文が任意個数続く。
(
@"((" +
$statement +
@")" +
$tokenDelimiter +
@")*"
) +
// 関数の終了。
(
@"(" +
$methodEnd +
@")"
) +
@")" )
)
) ;
setsearch
$searchPattern ,
(
0x00000002 |
0x00000010
)
;
#userData = 1 ;
$layer = @"test" ;
// 強調表示の範囲はユーザーに指定させる。
#startLineno = val(
input(
@"開始行" ,
@""
)
) ;
#startColumn = 0 ;
#endLineno = val(
input(
@"終了行" ,
@""
)
) ;
#endColumn = 0 ;
deletecolormarker
$layer ,
#userData ,
#startLineno ,
#startColumn ,
#endLineno ,
#endColumn
;
colormarkerallfound
-1 ,
-1 ,
-1 ,
(
0x00040000 | // 強調表示1を適用。
0x00000010
) ,
#userData ,
$layer ,
#startLineno ,
#startColumn ,
#endLineno ,
#endColumn
;
enableinvert ;
enabledraw ;
redraw ;
enablebreak ;
endmacro ;
// -------------------------------- hilabc.mac --------------------------------
そして、次のテキストに対して強調表示を行おうとしました。
// -------------------------------- abc.txt --------------------------------
// 文「g」が強調表示される。
// 1個目の強調表示対象の関数。
xx
w
g
s
g
e
g
y
i
g
yy
// 強調表示の対象外。
ww
w
g
s
g
e
g
y
i
g
zz
// 2個目の強調表示対象の関数。
xx
w
u
g
a
g
b
g
i
s
yy
// -------------------------------- abc.txt --------------------------------
しかし、実際に開始行を1、終了行を50にして実行したところ、2個目の関数の中の一
番上にある「g」だけが強調表示されるだけと
なってしまったため、検索ダイアログで同じような正規表現で検索をかけてもやはり
同じ「g」だけがヒットする状態となりました。
それから少し条件を変更(\s+を\s*)に変えたものが質問の検索パターンです。
> とりあえず、[a-z]は改行は含まないので、改行を含ませるとしたら以下のような
>感じになると思います。
> (?#lookbehind)(?#maxlines:50)(?#fulllinematch)(?<=(xx\s*)([a-z]\s*|\n)*)
>(g)(?=(\s*[a-z]|\n)*(\s*yy))
確かに、こちらで検索したら最初の「g」にヒットしました。ただ、\sにはもともと
タブやスペースに加えて改行も入っているので、
なぜ明示的に\nを入れたら意図したとおりに動いたのかよくわかりません。
> ただこれだとしても、ファイル先頭から下検索を開始したときに、最初のgにヒッ
>トするだけになってしまいます。
> gの位置から下検索を開始したときは、検索の対象となる文字列は前には遡らず、
>その行からの文字列が対象になります。
もしおっしゃる通りならば、1個目の関数の中の一番上にある「g」だけがヒットする
はずですが、実際にはこれではなく2個目の関数の
ほうでヒットしているので、やはり秀丸エディタかHmJre.dllのほうで何か問題があ
るのではと疑ってしまいます。
|
|