私の目的は、パターンの前に「#」が含まれていないパターンを一致させることです。たとえば、次のようになります。
array = ("# abc", "# abcd" "abc" " abc ", "abcd" "abc # foo")
「abc」に合わせたい。"abc"。"あいうえお" 。"abc#foo"'#'を含まない'abc'のパターンのみに一致させるには、どの正規表現が必要ですか?
試しm/[^#]+abc/g
ましたが、うまくいきません。
私の目的は、パターンの前に「#」が含まれていないパターンを一致させることです。たとえば、次のようになります。
array = ("# abc", "# abcd" "abc" " abc ", "abcd" "abc # foo")
「abc」に合わせたい。"abc"。"あいうえお" 。"abc#foo"'#'を含まない'abc'のパターンのみに一致させるには、どの正規表現が必要ですか?
試しm/[^#]+abc/g
ましたが、うまくいきません。
正規表現のルックビハインドとルックアヘッドを探します。
このようなもの:
m/^(?<!#).*/g
うまくいくかもしれませんが、それはネガティブな見方です。
あなたの基準はまったく明確ではありません。#
最初の文字として含まれているものをすべて拒否しますか?
print "$_\n" for grep /^[^#]/, @array;
それをします。abc
しかし、可能性のある先行スペースもチェックしたい場合は、
grep / ^ \ s * abc /、@arrayの場合は"$ _\n"を出力します。
これらはあなたのデータから同じ結果を生み出し、あなたが望むと言うアイテムを選択します。
これは機能するはずです、それは否定的な先読みを使用します:
^[^#]*abc(?!(.*#))
新しい考え...
私はあなたの質問をもう一度注意深く読みました、そして私はあなたが意図したものを正確に理解していなかったことを知りました。あなたの意図は本当に混乱していて、私が確かに言えるのは、文字列の同じ行のabcの後ろに#が1つ以上ある場合は、一致させたくないということだけです(そして、他に何かがあるかどうかは気にしないと思います。それらの間ではありません)。「abc#foo」と一致させたいと明示的に言っているのに、同時に「#」を含まない「abc」のパターンのみと一致させたいと言っているので、混乱しました。
この新しい解釈に従う場合、正しい正規表現は次のようになります。
(?<!(#.*))abc.*
式はabcの背後にあるテキストを消費せず、前のいずれかに#がまったく含まれていない場合は、その時点から一致します。
#
あなたが前にどこにも欲しくないならabc
、あなたはほとんどそこにいました。これを試してください:^[^#]*abc
。