2013-12-18 19 views
9

私login.txtファイルに次のエントリ正/負の先読みは

abc def 
abc 123 
def abc 
abc de 
tha ewe 

私はPerlを使用して肯定先読みを行うとき、私は以下の結果を得ているが含まれてい

cat login.txt | perl -ne 'print if /(?)abc\s(?=def)/' 
abc def 

とき私はgrepを使用しています。次の結果を得ています。

cat login.txt | grep -P '(?<=abc)\s(?=def)' 
abc def 

以下のようなperlとgrepの結果が表示されます。

cat login | perl -ne 'print if /(?)abc\s(?!def)/' 
abc 123 
def abc 
abc de 

grepの結果

cat login.txt | grep -P '(?<=abc)\s(?!def)' 
abc 123 
abc de 

Perlが負先読みためDEF ABC一致しました。しかし、def abcと一致してはいけません。私はabcとdef patternをチェックしています。 grepは正しい結果を返します。

は私のperlパターンには何かがありませんか?

+0

'(?)abc'は正の先読み正規表現ではありません。あなたは '(?=)abc'を望んでいました。私はそれが信じられないほど密な読書であることを認め、実験の最中に学んでいます... – smci

答えて

6

grepは、正規表現に対してチェックする文字列に改行を含めないため、abcが行末にあるときはabc\sは一致しません。 chlpを実行するか、-lコマンドラインオプションを使用すると、同様の結果が表示されます。

perlとgrep regexesの間で他の変更を加えた理由はわかりません。達成するはずの(?)は何ですか?

3

私はそうのようなあなたの正規表現を固定しようとするだろう:

/(^abc\s+(?!def).+)/ 

これはキャプチャします:あなたの否定先読みの正規表現の先頭に

abc 123 
abc de 

(?)はあなたperl -ne 'print if /(?)abc\s(?!def)/'で冗長

2

ですあなたはabc、次にスペースを見つけるためにperlに質問し、文字列はdefであってはなりません。これは、def abcと首尾よく一致します。abcの後にdefがなく、改行と一致するのが\sなので、正常に一致します。