perl regex - (\ s * / / \ s *)で始まらないfoobarを一致させる方法

perl regex - (\ s * / / \ s *)で始まらないfoobarを一致させる方法

基本的に、次のようにコメントされていない行で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

foobaraの右側に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削除が必要です。

関連情報