特定文字列以降を削除No.02484
Iranoan さん 10/03/07 00:38
 
 秀まるおさん今日は、Iranoan です。
 正規表現で、特定の文字列 (ここでは「XXX」とする) 以降を行末まで削除
する事は出来ますか? 単純な方法としては、検索文字列を「(?<=XXX).*$」と
でもすれば出来そうですが、
.............XXX...............XXX....................
等と、「XXX」が複数有ると、最初の「XXX」以降を削除してしまいます。
http://hidemaruo.dip.jp:81/turukame/turukame_1/x0612257.html#12259
にて、文字列否定の話がありましたが、こういった事が出来なるようにならな
いと無理でしょうか?

[ ]
RE:02484 特定文字列以降を削除No.02485
IKKI さん 10/03/07 02:01
 
たとえば

XXX(.(?!XXX))*$

はどうでしょう?

[ ]
RE:02485 特定文字列以降を削除No.02486
Iranoan さん 10/03/07 02:31
 
 IKKI さん今日は、Iranoan です。
> XXX(.(?!XXX))*$
>
> はどうでしょう?
 これは気が付きませんでした。確かに出来そうな気がします。

 しかし、実際によってみると、駄目なケースが残ってしまいますね。
 「XXX」では解りにくくなってきたので、「Abc」だとします。また削除した
いので、「(?<=Abc)(.(?!Abc))*$」とします。すると
.............AbcAbc
の様に連続する場合、最後の「Abc」が消えてしまいます。検索文字列を
「(Abc)(.(?!Abc))*$」として、置換文字列を「\1」としても同様です。
 不具合の気もするのですが、(?!Abc) だけで行末にヒットするからですかね。
 因みに、「(?<=Abc)(.(?!Abc))*\n」など「\n」に変えても同じでした。

[ ]
RE:02486 特定文字列以降を削除No.02487
秀まるお さん 10/03/07 11:48
 
   検索:   (abc)((?!.*abc.*).*)$
   置換:    \1

 でいけると思いますけど。

[ ]
RE:02487 特定文字列以降を削除No.02488
秀まるお さん 10/03/07 11:59
 
 (?<=Abc)(.(?!Abc))*$

 という正規表現が、「AbcAbc」という文字列の後ろのAbcにヒットしてしまう
のは、たしかにおかしいような気がします。

 今、トレースして調べてみます。

[ ]
RE:02488 特定文字列以降を削除No.02489
秀まるお さん 10/03/07 12:25
 
 調べてみたら、一応仕様で合ってると思いました。

 わかりやすくするために、とりあえず正規表現パターンを、

 (Abc)(.(?!Abc))*

 とします。それが「AbcAbc」にヒットしますが、もっと単純化するために、正
規表現を

 (Abc).(?!Abc)

 とした上で、それが「AbcAbc」の「AbcA」にヒットするのがなぜかを考えると
説明が付くと思います。

 つまり、(Abc). で正規表現がマッチするかどうかチェックして、それで
「AbcA」にヒットして、それから「bc」の部分が「(?!Abc)」にヒットするかど
うかチェックして、それで成功してしまうということでした。

 ということで合ってるようでした。

[ ]
RE:02489 特定文字列以降を削除No.02490
Iranoan さん 10/03/07 14:09
 
 秀まるおさん今日は、Iranoan です。
>  つまり、(Abc). で正規表現がマッチするかどうかチェックして、それで
> 「AbcA」にヒットして、それから「bc」の部分が「(?!Abc)」にヒットするかど
> うかチェックして、それで成功してしまうということでした。
 成る程。解説有り難うございます。

>    検索:   (abc)((?!.*abc.*).*)$
>    置換:    \1
 これでいけそうです。後方不一致って、最後でなくても使えるんですね。
 有り難うございました。

[ ]