2014-04-16 56 views
1

我很困惑Perl的前瞻(?=regex)和後視(?<=regex),需要一些幫助來理解它。由Perl的前瞻和後視困惑

是否先行意味着look to the right of (?=regex)

是否意味着反向預搜索look to the left of (?<=regex)

我也注意到,回顧後(?< =正則表達式)只與固定寬度的正則表達式的作品,我用一個簡單的例子來問下一個問題。

例如,請提供以下幾行代碼,我想匹配數字,但前提是它不在註釋行中。所以,我想下面

/(?<!^#)\d/ 
match a number if the line does not start with # 

這並不工作,它應該匹配2,不1

#Comment 1 
my $number = 2 

,是因爲它不是一個固定的寬度回顧後發正則表達式?

感謝

+0

你想要解析什麼語言? –

+0

我只是教自己一些Perl的正則表達式,僅用於例子。 –

+0

我明白,但沒有上下文和規則,你的問題沒有任何意義。 –

回答

5

正確,前瞻和lookbehinds從他們的正則表達式內的地方進行搜索。因此,您的示例/(?<!^#)\d/將與任何數字匹配,只要它不是立即在字符串開頭的#之後。

例如:

my $string = "123 #456 #789" 
while ($string =~ /(?<!#)(\d+)/g) { 
    print $1; 
} 

上面將打印1235689。只有4和7將被跳過,因爲它們立即被#

更新

談談你的具體的正則表達式之前:

use strict; 
use warnings; 

my $string = "#123 #456 #789"; 
while ($string =~ /(?<!^#)(\d+)/g) { 
    print $1; 
} 

上面會打印23456789,因爲只有數字1之前是一個#,它位於字符串的開頭。

+0

我仍然認爲(?<^#)是一個固定寬度的lookbehind,你能解釋一下嗎? –

+0

我想我明白了,'^'的意思是字符串的開頭不是在開頭的後面。 –

+1

@AskandLearn:*是固定長度的後視。什麼令你困惑?'^'在外觀內部和外部表現相同。它匹配字符串的開頭,以及緊跟在換行符後面的點,如果'/ m'修飾符生效 – Borodin