お品書き
書き直し中…
とりあえず、中へどうぞ
↓↓↓
スポンサーリンク

秀丸エディタの正規表現覚書(番外編) 特定の文字を含まない行の選択の解説

便利ツール/ソフトウェア
特定の文字を含まない行の選択は

⇒ ^(?!.*STRING).*

で可能ですが、なぜそうなるのか、解読を試みてみる -----
スポンサーリンク
スポンサーリンク
これは後方一致/後方不一致という機能を利用したものだそうで。

例えば、検索文字に「★★」を指定すると、当然全ての「★★」がヒットするわけですが、

「★★(?=☆☆☆)」とすると

『★★でかつ後方が☆☆☆である』 という条件になります。

「★★(?!☆☆☆)」とすると

『★★でかつ後方が☆☆☆でない』 という条件になります。


下記のようなサンプルテキストがあったとします

1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆

ここで検索ワードに「★★」を指定すると「★★」が全部ヒットします

1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆


ここで検索ワードに「★★(?=☆☆☆)」と指定すると、

★★でかつ後ろが☆☆☆ なので、

1行目と3行目の★★がヒットします

1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆


「★★(?!☆☆☆)」とすると

2行目と4行目の★★がヒットします

1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆


「^★★(?!☆☆☆)」とすると、先頭が★★でかつその後が☆☆☆でないもの、となりますので

4行目の★★だけがヒットします

1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆


すべての文字列を表す「 .* 」を末尾に入れて「^★★(?!☆☆☆).*」とすると、

先頭が★★でかつその後が☆☆☆でないものでそれ以降に何らかの文字が0回以上あるもの

なので4行目全部がヒットします

1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆


「^(?!.*☆☆☆)」とすると、「"先頭"」でありかつ後方が "前に何からの文字が0回以上ある☆☆☆" ではない となります。

※先頭「 ^ 」は強調表示もできないので、わかりやすく「置き換え」でやってみます

検索文字列「^(?!.*☆☆☆)」
置き換え文字列「@」



1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆

に適用すると、こうなりますね

1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆


これに後ろにすべての文字「 .* 」をくっつけてやると「^(?!.*☆☆☆).*」

2行目と4行目がすべてヒットすることになりますね

1| ★★☆☆☆
2| ☆★★◇☆
3| ★★☆☆☆
4| ★★◇☆☆

これで、☆☆☆を含まない行を選択できました


わからないのは、「^.*(?!☆☆☆).*」では何故だめなのか?ということ・・・

先頭から何らかの文字が0回以上あり、かつその後ろが☆☆☆でない・・・となるので、末尾が☆☆☆でない行が選択できそうな気がするのですが、なぜか結果はそうなりません。

※結果は全部の行がヒット

この辺は私の理解が足りないようで・・・
前方一致・後方一致については意外と思った通りの結果になるのですが、不一致系はなんだか難しい、今後の勉強ということで・・・(*_*)

コメント