2011-07-21 24 views
3
[[email protected] test]# perl -e 'use re "debug";"a" =~ /.*/'; 
Compiling REx `.*' 
size 3 Got 28 bytes for offset annotations. 
first at 2 
    1: STAR(3) 
    2: REG_ANY(0) 
    3: END(0) 
anchored(MBOL) implicit minlen 0 
Offsets: [3] 
    2[1] 1[1] 3[0] 
Matching REx ".*" against "a" 
    Setting an EVAL scope, savestack=3 
    0 <> <a>    | 1: STAR 
          REG_ANY can match 1 times out of 2147483647... 
    Setting an EVAL scope, savestack=3 
    1 <a> <>    | 3: END 
Match successful! 
Freeing REx: `".*"'` 

任何人都可以解釋這一點?在調試開啓時,您如何理解re.pm的輸出?

回答

6

輸出有兩個重要部分:模式編譯和運行時匹配。

第一部分描述編譯自動機中的節點,其中有三個節點。

  • STAR(n)匹配零個或多個以下的節點和通過節點Ñ繼續。
  • REG_ANY除換行符的任何字符(即/./
  • END標誌着自動機的最終狀態相匹配。

MBOL比賽開始-線的在多行匹配模式,即/^/m。這是因爲.*在你的模式開始時隱含的。 (請記住:默認情況下正則表達式量詞是貪婪的。)

可以匹配您的模式的字符串的最小長度爲零或空字符串。 (記住:*量詞總是成功!)

偏移的形式爲

NODENUM:POSITION[LENGTH] 

和鏈路節點在程序中的正則表達式。在你的情況下,.*(節點2和1)從你模式中的第一個位置開始,並且結束狀態隱含在那裏。適用於正則表達式調試器的偏移量,例如,以突出顯示哪個子模式當前正試圖匹配。

現在編譯好了,它可以匹配,後面的部分跟蹤執行。所述Pragmas and Debugging section of the perlretut documentation解釋描述匹配進展的線的形式:

每個步驟的形式n <x> <y>,具有<x><y>匹配的字符串並且尚未匹配的部分的一部分。

您問題中的匹配以沒有文本消耗開始,然後.*匹配a,並且模式匹配成功。

評估範圍是與您不使用的executable code in regexes相關的機器。

Debugging Regular Expressions section of the perldebguts documentation給出了更多的背景信息,並且一如既往地使用源碼盧克!

+0

看來我們從輸出中唯一可以得到的是正則表達式是從最右側解釋的。那裏有其他的東西嗎? –

相關問題