⇒ ^(?!.*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回以上あり、かつその後ろが☆☆☆でない・・・となるので、末尾が☆☆☆でない行が選択できそうな気がするのですが、なぜか結果はそうなりません。
※結果は全部の行がヒット
この辺は私の理解が足りないようで・・・
前方一致・後方一致については意外と思った通りの結果になるのですが、不一致系はなんだか難しい、今後の勉強ということで・・・(*_*)
コメント