2014-03-25 68 views
0

我有一個解析文本問題到數組preg_match_all - 解析簡單的代碼

我的正則表達式:

/\s*DEF\s+FUNC\s+(\w+\d*)\((\w*[.\s\w]*|)\)\s*{\s*(.*)\s*}/s 

我的文字:

DEF FUNC test(param) 
{ 
    test1; 
}; 

DEF FUNC testSecond() 
{ 
    test1 
    test1 
}; 

它應該返回數組一樣:

(
[0] => DEF FUNC test(param) 
     { 
      test1; 
     }; 

[1] => DEF FUNC testSecond() 
     { 
      test1 
      test1 
     }; 
) 

但現在我只有一個元素:

(
[0] => DEF FUNC test(param) 
     { 
      test1; 
     }; 

     DEF FUNC testSecond() 
     { 
      test1 
      test1 
     }; 
) 

我該如何解決這個問題?

+1

你需要爲此實現一個*真正的解析器*。 – zerkms

+1

它的小事情很簡單。我不會創建新的語言;) – mtoy

+0

正則表達式不計數,因此您無法在任意數量的匹配之前放置遞增數字。 – CAustin

回答

1

使*量詞懶惰與?(.*?)

而且您正則表達式可以簡化,(\w*[.\s\w]*|)相同([.\s\w]*)(和.在這裏代表一個點,沒有任何字符):

/\s*DEF\s+FUNC\s+(\w+\d*)\([.\s\w]*\)\s*{\s*(.*?)\s*}/s 
0

這是因爲貪婪的。塊內的.*將盡可能多地讀取所有內容,這意味着最後的}將是文本中的最後一個。

爲了讓它不貪心,你可以在*量詞後加一個問號。

/DEF\s+FUNC\s+(?:\w+\d*)\([.\s\w]*\)\s*{.*?}/s 

我還簡化了正則表達式如下:

  • 製造捕獲組非捕獲,併除去
  • 前導空白似乎沒有必要不必要組
  • (\w*[.\s\w]*|)[.\s\w]*相同
  • 而在塊內,.*已經照顧周圍的白色空間e

最後,這個正則表達式不是很可靠。如果有一個閉合的大括號,},在DEF塊的某個地方,那麼它會把所有東西都搞砸了。使用正則表達式無法正確執行此操作。

如果你真的認真對待這個問題,那麼編寫一個小解析器可能就是要走的路。