正規表現がマッチしないNo.38030
fzok4234 さん 20/03/10 12:39
 
検索パターン

(?#lookbehind)(\y|\Y)(?=\()(a|(\((?=a*\)))|((?<=\(a*)\)))*(?<=\))(\y|\Y)

で、文字列

(aaaaaaaaaaaa)

がマッチしません。この正規表現にどこかおかしいところがあるのでしょうか。


[ ]
RE:38030 正規表現がマッチしないNo.38033
秀丸担当 さん 20/03/10 15:20
 

外側の括弧の、前方一致と後方一致が逆になっている気がします。
最初の(?=\()が前方一致だとしたら、(?<=\()にして、
最後の(?<=\))が後方一致だとしたら、(?=\))にするといいと思います。

[ ]
RE:38033 正規表現がマッチしないNo.38034
fzok4234 さん 20/03/10 16:18
 
問い合わせの内容の説明不足で失礼しました。

問題の正規表現は実は、例えば

aaa(a(aa)aa)a)aa(aaa

という文字列の中から4文字目から14文字目までの

(a(aa)aa)a)

だけを抜き出すことを意図したものです。

正規表現

(?#lookbehind)(\y|\Y)(?=\()(a|(\((?=a*\)))|((?<=\(a*)\)))*(?<=\))(\y|\Y)

の中央部の

(a|(\((?=a*\)))|((?<=\(a*)\)))*

はaと括弧の羅列の内、括弧が向かい合わせになっている条件を指定したもので、両端の

(\y|\Y)

は上記の条件を満たす部分の開始点と終了点で、左側の

(\y|\Y)(?=\()

は開始点の右隣がが(であること、右側の

(?<=\))(\y|\Y)

は終了点の左隣が)であることを指示するものであるから、左端の(?=\()が後方参照
で右端の(?<=\))が前方参照であるのは意図的な配置です。

実際の運用はもっと複雑なパターンで、前方参照と後方参照の部分に開始点と終了点
を明示的に指定するための条件が入ります。括弧の入れ子で構成されたC#のタプル型
の型名だけを抜き出す強調表示を定義しようとして、マッチした文字列にタプルとは
関係ない括弧を除外しようとしてうまくいかなかったため、問題を洗い出すため簡単
な例を示した次第であります。


[ ]
RE:38034 正規表現がマッチしないNo.38036
fzok4234 さん 20/03/10 16:39
 
実際、

(?#lookbehind)(\y|\Y)(?=\()(a|(\((?=a*\)))|((?<=\(a*)\)))*(?<=\))(\y|\Y)



aaa(a(aa)aa)a)aa(aaa

の中を検索しても、カーソルが9文字目に移動するだけで何もヒットしません。バー
ジョンはV8.91 float x64です。


[ ]
RE:38036 正規表現がマッチしないNo.38038
秀丸担当 さん 20/03/10 17:32
 

勘違いをしていたようで、申し訳ありません。
とても複雑で、十分に理解していないかもしれないですが、(\((?=a*\)))や、((?<=\
(a*)\))が最小の括弧の対応のようなので、入れ子のうち最小の部分だけにしかなら
ないと思います。例えば(\((?=[a\(]*\)))とか、((?<=\([a\)]*)\))とか、実際はも
っと複雑かもしれないですが、入れ子でもいいようにしたらいい気がします。
外側の、(\y|\Y)(?=\()や(?<=\))(\y|\Y)は、それ自体をくくって((\y|\Y)(?=\())や
((?<=\))(\y|\Y))としたほうがよさそうです。


[ ]
RE:38038 正規表現がマッチしないNo.38039
fzok4234 さん 20/03/10 18:11
 
おっしゃる通りにしたら、見事に意図したとおりにマッチしました。ありがとうござ
います。

これをヒントに問題の解決に取り組んでみます。


[ ]