一括置換の際のワイルドカードの取り扱いNo.13390
立文字 さん 02/11/15 09:38
 
以前に尋ねたことがあったようにも思うのですが、以下のような一括置換の際のワイ
ルドカードの取り扱い方に困っています。

テキストが以下のようになっていたとします。

(ABC)DEF(HI)JKLM

そこで、()内を削除してしまいたく、正規表現で一括置換をするときに、
検索文字列 (.*)
置換後文字列 null
としますと、結果は、"JKLM"だけになってしまいます。
望むべき結果は、"DEFJKLM"であるのですが・・・。
1論理行の中に()で括られる部分が一個所であったり、複数個所あったりする場合、
これが使えなくて、とても不自由しております。
この作業のために、MIFESを使うことを余儀なくされているのですが、これは、仕様
であるといわれたらおしまいなのですが、なんとか改変されないでしょうか。
強く希望する次第です。

[ ]
RE:13390 一括置換の際のワイルドカードのNo.13391
たけのこ さん 02/11/15 09:57
 
たけのこです。

たいていの正規表現処理系では“*”は『欲張り』(一番長
くなるパターン)に作用するので、

>検索文字列 (.*)

は、先の例では

>(ABC)DEF(HI)

にマッチします。つまり *.equals("ABC)DEF(HI") って
ワケです。この欲張りを制限してしまえばいいのです。

([^)]*)

↑で、開きカッコから始まり、閉じカッコ以外の0文字以上
の文字列が続いた後に、閉じカッコがある……と云う文字
列にマッチします。

[ ]
RE:13391 一括置換の際のワイルドカードのNo.13394
立文字 さん 02/11/15 13:35
 
たけのこさん、レスをありがとうございます。

>たいていの正規表現処理系では“*”は『欲張り』(一番長
>くなるパターン)に作用するので、

やっぱりそういうものなんですか。
確かにご指示いただいた方法であれば、パターンマッチしますので、
望んだ通りになります。
ともかく、この方法を利用するとして・・・。
でも、一連のテキスト処理をしていると、うっかりやってしまうん
ですよねぇ、この置換。

あとで、なんでこんな結果に? と思ったときには、時すでに遅し
で・・・。

秀丸のプログラムにお使いの処理系が変わらない限り、こういった
ことは無理なんでしょうかねぇ。

[ ]
RE:13394 一括置換の際のワイルドカードのNo.13395
アルビレオ さん 02/11/15 13:47
 
>秀丸のプログラムにお使いの処理系が変わらない限り、こういった
>ことは無理なんでしょうかねぇ。

正規表現のプログラムは独立したDLLになっているのでインターフェイス部分さえ合
わせれば差し替え可能です。
マクロライブラリにPerl風正規表現を使えるようにする Arimac さんの「正規表現パ
ワーアップDLL(BRegIf.DLL) v0.0.1.0」というものがあります。

でも、検索に使われる正規表現は最長一致が基本というのは別に秀丸に限った話では
なく、「正規表現とはそういうもの」としかいえないです。
秀丸に独自のローカルルールを採用すると、普通の正規表現のつもりで使う人が混乱
すると思いますが。

[ ]
RE:13395 一括置換の際のワイルドカードのNo.13400
ENCODINGSHIFTJIS さん 02/11/15 18:02
 
>でも、検索に使われる正規表現は最長一致が基本というのは別に秀丸に限った話で
>はなく、「正規表現とはそういうもの」としかいえないです。

長年の伝統で定着しているからそうですね。
 MIFES の「最短一致」はそのエディタのローカル・ルールです。
「それなりの見解ではありますが」

機能強化競争のあるPerl / .NET  ではそういうのもありますが
使いこなしは、さらに習熟が必要です。

●エディタの対話操作中では使えるか?

regex には、ほかにも次の機能があります。 ( .NET スクリプトのヘルプ)

最短一致の量指定子 (??、*?、+?、{n,m}?)。これらの量指定子は、バックトラッキ
ング エンジンに対し、繰り返しの回数が最も少ない文字列を最初に検索するように
指示します。逆に、通常の最長一致の量指定子は、繰り返し回数の最も多い文字列を
最初に検索しようとします。

肯定先読み。この機能により、バックトラッキング エンジンは部分表現と一致する
文字列を見つけた後で、テキスト内の同じ位置に戻ることができます。同じ位置から
複数のパターンを確認しながらテキスト全体を検索する場合に便利です。
 
否定先読み。この機能により、部分表現に一致する文字列が見つからなかった場合の
み、表現に一致できるようになります。ある文字列を除外する表現の方が、含める表
現よりも単純になることが多いので、この機能は検索を簡略化する場合に特に力を発
揮します。たとえば、" non" で始まらない単語を表す表現を記述するのは簡単では
ありません。

条件付き評価。この機能により、エンジンは直前の部分表現検索の結果に従って、複
数の代替パターンを使用した検索を実行できます。そのため、より強力な前方参照が
可能になります。たとえば、部分表現で左かっこをキャプチャした後に、右かっこを
検索できます。

非バックトラッキング部分表現。最長一致部分表現とも呼ばれます。この機能により、
バックトラッキング エンジンは、部分表現と最初に一致した文字列だけを確実に検
索できるようになります。この場合、表現は、部分表現を含む表現とは関係ないよう
に処理されます。この構成体を使用しない場合は、より大きな正規表現によるバック
トラッキング検索時に、部分表現の動作が変化する可能性があります。
右から左への一致。この機能は、左から右ではなく右から左に向かって検索する場合
や、パターンの左側ではなく右側で検索を開始した方が効果的な場合に便利です。

肯定/否定後読み。先読みと似ています。この正規表現エンジンを使用すると完全な
右から左への一致を実行できるので、制限のない後読みが可能になります。

[ ]
RE:13400 一括置換の際のワイルドカードのNo.13401
たけのこ さん 02/11/15 18:21
 
たけのこです。

>最短一致の量指定子 (??、*?、+?、{n,m}?)。

これが結構便利ですよね(私はjakarta projectのRegexpの
方をよく使う(使わされる)のですが)。できるのであれ
ば、あとはPOSIXを理解してくれたら、個人的には満足です。

……って、そういうライブラリあるのかな?

[ ]
RE:13394 一括置換の際のワイルドカードのNo.13402
Arimac さん 02/11/15 21:04
 
アルビレオさんが紹介してくれていますが、
BRegIf.DLLとbabaqさん作成のBREGEXP.DLLを組み合わせると
秀丸エディタでもENCODINGSHIFTJISさんの書いているところの
最短一致の指定が出来るようになります(^^;

例としては \(.*?\) というように * の後ろに ? を付けるだけです。

[ ]