後方参照で重複削除No.29794
KRT さん 11/05/12 12:01
 
正規表現の問い合わせですみません。

例:
元: <a><b><c><d><e><a><b><c><f>
欲しい結果: <a><b><c><d><e><f>

例では、<a><b><c>という文字列が重複しており、
後方側を削除したいのですが、

(<[^>]+><[^>]+><[^>]+>)\f(<[^>]+>)*\1 -> \1

という表現だと、前方側が削除されて、
<d><e><a><b><c><f>、となります。

後方側を削除する事は可能でしょうか?
出来ない場合、削除する代わりに、重複部の<a><b><c>のみを、
抽出するという正規表現はありますか?

恐縮ですが、宜しくお願いします。

[ ]
RE:29794 後方参照で重複削除No.29795
colder さん 11/05/12 13:16
 
colderです

(<[^>]+><[^>]+><[^>]+>)((<[^>]+>)*)\1 → \1\2

で例に挙げたパターンではうまくいきます。


[ ]
RE:29795 後方参照で重複削除No.29796
KRT さん 11/05/12 14:13
 
colderさん、有り難うございます。助かりました。

ちなみに、重複部のみの抽出も、
^.*(<[^>]+><[^>]+><[^>]+>)((<[^>]+>)*)\1.*$ → \1
で出来るのですが、何故か例の様に、重複部から始まる行では、
ヒットしません。
事前に、文頭にダミーの#でも付ければ問題ないので、マイナーですが、
お手間でなければ。。

大変有難うございました。
お陰様で、後方参照のやり方が解ってきました。

[ ]
RE:29796 後方参照で重複削除No.29797
秀丸担当 さん 11/05/12 14:41
 

>ちなみに、重複部のみの抽出も、
>^.*(<[^>]+><[^>]+><[^>]+>)((<[^>]+>)*)\1.*$ → \1
>で出来るのですが、何故か例の様に、重複部から始まる行では、
>ヒットしません。

報告ありがとうございます。
調べてみたところ、V8.02では言われている通りになって、V8.03以降では大丈夫
でした。
付属のHmJre.dllのV3.35あたりの修正が関係していそうです。

 HmJre.dllの改版履歴
 http://hide.maruo.co.jp/software/hmjrehist.html

もしV8.02以下をお使いでしたら、最新版にされると直っているかもしれません。
最新版は以下のページからダウンロードできます。

 秀丸エディタ
 http://hide.maruo.co.jp/software/hidemaru.html

[ ]
RE:29797 後方参照で重複削除No.29798
KRT さん 11/05/12 19:49
 
有難うございます。
V8.01でしたが、最新版でOKになりました。
お世話にになりました。

[ ]