|
abc|xyz
(abc|)
(abc|)
は "something or nothing" と呼ばれる表現です。
OR関数は左のパターンから順番にテストしていきますので、空文字をテストするのは "abc" のテストを行った後です。
この事から、空文字が「"abc" ではない空文字」に等しいと感じられますが、厳密には少し違います。
"abc" にマッチしても後ろに続く表現にマッチしなければ、Proxomitronは次候補の空文字でテストを試みます。
[Patterns] Name = "something or nothing" Active = TRUE Limit = 256 Match = "(Prox|)omitron" Replace = "Replaced"
上のフィルタは Proxomitron
と omitron
を Replaced
に置換します。
これは期待通りに動作しますが、もし、検索表現が以下のようになっていたら、どうなるでしょう?
(Prox|)Proxomitron
この場合は ProxProxomitron
と Proxomitron
を Replaced
に置換します。
Proxomitron
にマッチするまでの過程で、左候補の Prox
にはパスしました。
が、左候補の後ろの表現に合致しなかったためにフィルタとしてはマッチせず、結果として右候補の空文字にマッチしています。
これは「something or nothing」の場合でも、Proxomitronが後ろの表現を2度検索する事を示しています。
後ろに「時間のかかる複雑な表現」があったり、$LSTがある場合は (Prox|(^Prox))
に変更する事を検討してください。
NOT関数で「"Prox" ではない」を実現しているので、本当の意味で「something or nothing」の表現にすることが出来ます。