2012-10-27 87 views
1

想到一個字符串是這樣的:JavaScript正則表達式得到大括號之間的內容(裏面大括號)

public function test(data) 
{ 
    if (1 == 2) 
    { 
     alert("Wtf?"); 
    } 

    switch (data) 
    { 
     case 'test': 
      alert("Test"); 
     break; 
    } 
} 

我需要解析該字符串,讓我有一個函數體(內容) 。

我已經得到了我的reg exp工作,所以我有函數的內容,但是當有一個結束}。正則表達式停止和內容看起來就像這樣:

if (1 == 2) 
{ 
    alert("Wtf?"); 

我真的希望有人能幫助我..

這是我的註冊精通用於分割字符串:

var test = classContent.replace(/(?:(private|public)\s*)function\s*([a-zA-Z0-9_]+)\s*\(([a-zA-Z0-9_\,\s]*)\s*\)\s*{([^}]+)\}/gi, function(a, b, c, d, e) { 

    classMethods[c] = { 
     visibility : b.trim(), 
     params : d.trim(), 
     content : e.trim() 
    }; 
}); 
+6

嚴格地說,你不能用正則表達式來解析那樣的語法。如果您對要匹配的文本施加一定的約束,您可以這樣做,但如果您確實想匹配任意JavaScript構造,則需要一個完整的JavaScript解析器。 – Pointy

+2

有關@Pointy所說的內容的其他信息http://en.wikipedia.org/wiki/Chomsky_hierarchy – Prinzhorn

+2

如果最後一次關閉'}'始終與打開的'{'''相同的縮進級別,那麼您只有一個正則表達式的機會, ,並且如果在同一級別上沒有中間支撐。你能保證嗎? –

回答

2

這對於正則表達式來說通常太難處理了。它們不能很好地處理嵌套結構。有些風格支持遞歸模式,但即使如此,在這種情況下也是如此。快速解決您的特定問題會是這樣:

/(?:(private|public)\s*)function\s*([a-zA-Z0-9_]+)\s*\(([a-zA-Z0-9_\,\s]*)\s*\)\s*{(.+)\}/gis 

這允許大括號之間的任何字符(包括大括號),而且由於+是貪婪的,這將一路走到底。

但是,如果您的字符串可以包含多個函數,則會從第一個函數名稱轉換爲最後一個關閉}。我有一種感覺,這是你的情況,因爲你使用了全局修飾符g

如果這是這種情況(或者無論如何),請考慮使用不同的方法(即,JavaScript解析器或自己分析字符串並計算大括號)。也許this question會幫助你。

0

JavaScript不提供PCRE遞歸參數(?R)

檢出Steve Levithan's blog,他寫了XRegExp,它取代了大部分丟失的PCRE位。還有一個Match Recursive插件。

+0

然而,我懷疑即使使用完整的PCRE,這樣做處理所有的邊緣情況將是困難的或不可能的(請參閱對問題的評論)。 –

+0

@ T.J.Crowder - 我的答案是**最好的正則表達式解決方案**,這當然不比使用解析器更好;然而隨着OP要求正則表達式,這就是它... –

+0

@Ωmega:有時你必須改變這個問題。 :-) –

相關問題