技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

サクラエディタ:特定の文字列を含まない行をgrepで抽出する

UNIXgrepコマンドだと-vオプションで指定した文字列を含まない行を抽出することができますが、サクラエディタgrepだと一見できないように見えるので。
 
結論から言うと、
^((?!hoge).)*$
と指定すればできます(「hoge」は任意の文字列)。
 
以下、おまじないは怖いという人向けに説明です。
 
【例】
grep対象のファイル
____hoge____
____fuga____
____piyo____
 
・失敗例…[^...](否定)を使った場合
[^...](否定)だとできません。一文字しか判断できないので。
 
□検索条件  "[^hoge]"
C:\tmp\a.txt(1,1)  [SJIS]: ____hoge____
C:\tmp\a.txt(2,1)  [SJIS]: ____fuga____
C:\tmp\a.txt(3,1)  [SJIS]: ____piyo____
3 個が検索されました。
 
□検索条件  "[^h][^o][^g][^e]"
C:\tmp\a.txt(1,1)  [SJIS]: ____hoge____
C:\tmp\a.txt(2,1)  [SJIS]: ____fuga____
C:\tmp\a.txt(3,1)  [SJIS]: ____piyo____
3 個が検索されました。
 
・成功例…(?!式)(否定先読み)を使った場合
(?!式)(否定先読み)だと文字列で判断できるので可能です。
 
□検索条件  "^((?!hoge).)*$"
C:\tmp\a.txt(2,1)  [SJIS]: ____fuga____
C:\tmp\a.txt(3,1)  [SJIS]: ____piyo____
2 個が検索されました。
 
【説明】
・否定先読みについて
公式ドキュメント参照ですが、Sakuraでは否定先読みができます。
 
利用可能な正規表現

http://sakura-editor.sourceforge.net/htmlhelp/HLP000089.html
 
否定先読みの機能の説明については、以下のページが参考になります。
 
正規表現の先読み・後読みを極める! - あらびき日記

https://abicky.net/2010/05/30/135112/
 
・今回の指定条件について
(?!hoge). とすることで、直後にhogeが続く箇所以外の全ての箇所がヒットします。
上記の例で言うと、「hoge」の1文字目の「h」以外は全てヒットします。

(なお、.(?!hoge) だと、「hoge」の直前の「_」以外が全てヒットします。これだと、文頭がhogeで始まる場合に問題が生じることになります。)
 
((?!hoge).)* とすることで、ヒット箇所の0回以上の繰り返しを表現できます。
 
^((?!hoge).)*$ とすることで、行頭から行末までヒット箇所の0回以上の繰り返し、となります。
ヒット箇所は何回繰り返されても良いのですが、文頭から文末まで続いている必要があります。
「____hoge____」は途中でヒットしない箇所が出てくるので、この条件には引っかかりません。
なお、0回の繰り返しを含むので、空行(改行のみの行)でも条件に引っかかります。
(上記の例を作った後に、念のために空行も引っかかることを確認しました)