2011-02-05 40 views
2

我試圖破譯這個正則表達式浮點數的正式定義(從php.net)在正則表達式的語法解釋括號

LNUM   [0-9]+ 
DNUM   ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*) 
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM}) 

LNUM意味着數字0出現一次或多次到9 DNUM意味着0到9位數字出現零次或多次,後面跟着一個小數點。我不知道如何解釋{LNUM}。從我讀過的括號表示重複,但以後就不會

[\.]{LNUM} 

意味着小數點LNUM出現(這是沒有意義的)。然後在交替的第二部分(在|字符之後),{LNUM}出現在開頭,並且我沒有發現在regexp語法(POSIX或Perl)中使用大括號的定義。有人可以幫我解決這個問題嗎?

謝謝你,比爾

回答

2

這不是嚴格的正則表達式語法。 {LNUM}是LNUM定義的佔位符。例如,在嚴格的正則表達式語法第二行是

([0-9]*[\.][0-9]+) | ([0-9]+[\.][0-9]*) 
+0

好簡單的解釋。謝謝。 – Bill 2011-02-05 20:44:21

1

是的,無關與正則表達式,它看起來像一個變量替換。
你說這是正式的定義?代入並看看指數符號後,看起來整個事物可以被修剪下來。此外,在那裏使用量詞會使無限多的數字。他們沒有考慮到任何地方的空間,也許它是對某個東西的嚴格分析。

[+-]?(([0-9]+ | ([0-9]*[\.][0-9]+) | ([0-9]+[\.][0-9]*)) [eE][+-]? [0-9]+)

[+-]?    # '+' or '-' 0 or 1 time 
(     # group 1, not needed 
    (     # group 2 
     [0-9]+    # a digit, 1 or more times 
     |      # OR 
     (     # group 3 
      [0-9]*    # a digit, 0 or more times 
      [\.]    # a '.' exactly 1 time, character class not needed 
      [0-9]+    # a digit, 1 or more times 
     )     # end group 3 
     |      # OR 
     (     # group 4 
      [0-9]+    # a digit, 1 or more times 
      [\.]    # a '.' exactly 1 time, character class not needed 
      [0-9]*    # a digit, 0 or more times 
     )     # end group 4 
    )     # end group 2 
    [eE]     # 'e' or 'E' exactly 1 time 
    [+-]?    # '+' or '-' 0 or 1 time 
    [0-9]+    # a digit, 1 or more times 
)     # end group 1, not needed 
+0

那麼,他們稱之爲一個正式的定義(http://www.php.net/manual/en/language.types.float.php),但我猜不是。感謝您的詳細分析。很有幫助。 – Bill 2011-02-05 20:43:33