2010-06-27 32 views
3

我正在嘗試編寫一個正則表達式來識別單行文本,並將下劃線(_)識別爲行連續字符。例如,「foo_ \ nbar」應該被視爲單行,因爲「foo」以下劃線結尾。我想:這是否違反了「最左邊最長」的原則?

$txt = "foo_\nbar"; 
print "$&\n" if $txt =~ /.*(_\n.*)*/; 

然而,這僅打印:

foo_ 

這似乎違背了Perl的正則表達式的 「最左邊最長」 的規則!

有趣的是,如果我刪除了正則表達式的最後一個星號(*),即:

$txt = "foo_\nbar"; 
print "$&\n" if $txt =~ /.*(_\n.*)/; 

確實打印:

foo_ 
bar 

但我需要的明星認識到「0或更多「延續!

我在做什麼錯?

+0

這是什麼,你試圖用這個正則表達式來實現呢?你想用它做什麼? – Zaid 2010-06-27 14:14:02

+0

「認出單行文字,用下劃線(_)識別爲行續字符」 – JoelFan 2010-06-27 14:15:39

回答

6

這究竟是爲什麼被@ysth解釋。要解決它,你可以使用以下正則表達式:

/([^_\n]|_.)*/s 
5

Perl不做「最左邊的」;相反,每個正則表達式都有一個明確的行爲方式。只要正則表達式的其餘部分完全匹配,您的首字母*就會盡可能匹配。爲了防止它吞食_,這樣做:

/(.*(?!(?<=_)\n)_\n)*.*/ 
+0

哇......這是一些沉重的正則表達式魔法...... – JoelFan 2010-06-27 14:43:03

+0

不是:'。*'匹配非換行符,'( ?''但不要以'(?<= _)'前面加上'_','\ n'換行符'''*'爲儘可能多的行重複'.''和獲得以下行 – ysth 2010-06-27 15:01:47

+0

ZyX's更好,但是對定義問題的直譯性較差。 – ysth 2010-06-27 15:02:27

1

還有的正則表達式設計的兩種基本形式:

POSIX定義了最左邊,最長的味道。例如:將任何「a | b」更改爲「b | a」對完全匹配沒有任何作用。

PERL定義了左偏味。每個「a | b」檢查左分支「a」,如果匹配,那麼「b」不會被檢查。因此「a | b」很少與「b | a」相同。這裏的*就像()| a | aa | aaa | aaaa | ...

+4

不,a *就像... | aaaa | aaa | aa | a |()。一個*?就像()| a | aa | aaa | aaaa | .... – ysth 2010-06-27 21:11:25

相關問題