基本的に、次のようにコメントされていない行でfoobarを探したいと思います。
// foobar # do not match me
foobar # match me
otherfoobar # do not match me
コメント行を一致させるには、次を使用します。^(\s*//\s*)\bfoobar\b.*$
コメントアウトされていない行を一致させる方法は?
メモ:
不要な努力を避けるために、答えを「^...$」に制限してください。これは、一致のためにPerlに送信された文字列内でのみ実行する必要があります。
また、foobarは\ bfoobar \ bのように完全に一致する必要があります。
最後に、 \bfoobar\b の前には、スペースやコメントの署名を除く任意の文字を含めないでください。
答え1
foobar
aの右側にaがない場合は、次//
のように表現できます。
^(?:(?!//).)*\bfoobar\b
*
これは、ゼロ個以上の()文字()で構成されるシーケンスです。各文字は.
シーケンスの先頭にありません()、その後に単語の境界で区切られた文字が続きます。//
(?!//)
foobar
答え2
Perl準拠の正規表現を使用するツールではなくPerl(言語)を使用している場合は、1つの正規表現に限定する理由はありません。
次の内容は、コメントアウトされていない行にのみ一致します。
$ perl -ne 'print if not m,^\s*//, and /\bfoobar\b/' < file.txt
foobar # match me
他のユーティリティやPerl以外の正規表現を使用している場合でも、複数の正規表現を使用するのが最も簡単です。
$ < file.txt grep -ve '//' | grep '\<foobar\>'
foobar # match me
代わりに、単一のPerl正規表現に制限されている場合は、次のようになります。
grep -P '^\s*+(?!//).*\bfoobar\b.*$' file.txt
\s*+
これは「所有」表現、すべての先行スペースと一致し、それらを送らないでください。次に、(?!//)
先行スペースの後に続く内容がコメントマークでないことを確認し、最後に行のfoobar
どこでもハイフンを探します。
(所有者修飾子なしでスペースが一致する場合、正規表現エンジンは先行スペースで終了し、誤った位置にあるコメントマークを確認してコメント行が一致するようにすることができます。)
テストデータ:
$ cat file.txt
// foobar # do not match
foobar # 1st match
otherfoobar # do not match
something foobar # 2nd and final match
$ grep -P '^\s*+(?!//).*\bfoobar\b.*$' file.txt
foobar # 1st match
something foobar # 2nd and final match
答え3
否定の問題が過度に複雑になる必要はないと思います。
たとえば、次の行を拒否したいとします。
"^(\s*//\s*).*(\bfoobar\b).*$"
つまり。'//'
開始マージンにコメント署名を付け、その後に完全な'foobar'
単語を含む内容が続きます(明確にするために角かっこを含む)。
これを否定するには、次のようにします。
"^(?!\s*//\s*).*(\bfoobar\b).*$"
私たちはそれを次(\s*//\s*)
のように置き換えます。(?!\s*//\s*)
'//'
これは、先頭のスペースにコメント署名があり、その後にパターンがあるすべての項目を無視します。
結果:
// foobar will not be matched
// whatever foobar will not be matched
foobar will be matched
whatever foobar will be matched
whateverfoobar will not be matched
メモ:.*
以前の設定を変更してさらに詳細に調整できます(\bfoobar...
。
たとえば、私はできます"^(?!\s*//\s*)\s*(\bfoobar\b).*$"
foobar will be matched
whatever foobar will **NOT** be matched
警告する:'foobar'
上記の方法を試したように、ランダムな文字列に置き換えると'${foobar}'
失敗します。その理由は、一般的な「フーバー」が単語文字のみで構成されているため、(\bfoobar\b)
一致しないためです。この場合、\b
削除が必要です。