2014-03-30 47 views
2

我正在編輯我的javascript.lang文件以突出顯示函數名稱。 這是我目前使用的gtksourceview的表達式。在gedit中,突出顯示括號內的函數調用

<define-regex id="function-regex" > 
(?&lt;=([\.|\s])) 
([a-z]\w*) 
(?=([\(].*))(?=(.*[\)])) 
</define-regex> 

這裏的正則表達式本身

(?<=([\.|\s]))([a-z]\w*)(?=([\(].*))(?=(.*[\)])) 

這似乎爲如FOO(A)這是我很滿意的情況下工作。 但是,我遇到麻煩的是,如果我想要突出顯示另一個函數調用括號內的函數名稱。

foo(bar(A)) 

或把它更加嚴格

foo{N}(foo{N-1}(...(foo{2}(foo{1}(A))...)) 

因此,與本例中,

foo(bar(baz(A))) 

我的目標是,它突出FOO,酒吧,巴茲而已。

我不知道如何處理欄功能。我已閱讀了有關使用(?R)或(?0)遞歸執行正則表達式的方法,但我沒有成功使用它在gedit中遞歸地突出顯示函數。

P.S. 以下是我目前用來確定成功的測試。

initialDrawGraph(toBeSorted); 
$(element).removeClass(currentclass); 
myFrame.popStack(); 
context.outputCurrentSortOrder(V); 
myFrame.nextFunction = sorter.Sort.; 
context.outputToDivConsole(formatStr(V),1); 

回答

1

好吧,看起來我正在做這比它需要更復雜。

我能用這個更簡單的正則表達式實現我所需要的。我剛剛告訴它停止尋找左括號。

([a-zA-Z0-9][a-zA-Z0-9]*)(?=\() 
0

以下regex作品嵌套函數(注:這是regex的Python版本您可能會或可能不會需要做一些語法調整厚福,你會明白我的意思。):

[已過時] '(\w+\()+[^\)]*\)+'

[增訂](應該工作,希望)

(\w+\()+([^\)]*\)+)*

+0

它看起來像正則表達式有它只是突出了括號內的一切問題。 – joelliusp

+0

如果您有任何東西_but_'F1(F2(F3(...))) - 'F1(F2()+ F3())'不適用於此解決方案 –

+0

@UriAgassi,謝謝您的輸入。現在就開始工作吧。 – sshashank124

1

平衡括號不是一個正則表達式,因爲它需要內存(請參閱:Can regular expressions be used to match nested patterns?)。對於一些實現,對於recursion in regular expressions實現:

匹配平衡構建

遞歸的主要目的是要匹配的平衡結構或 嵌套結構。通用正則表達式是b(?:m|(?R))*e其中b是 什麼開始構造,m是什麼可以發生在 構造中,而e是可以在構造的末尾發生的。對於 正確的結果,b,me中沒有兩個應該能夠匹配 相同的文字。您可以使用原子組代替 未捕獲組以改善性能:b(?>m|(?R))*e

一個常見的現實世界的用途是匹配一組平衡的括號。 \((?>[^()]|(?R))*\)匹配單個對括號與之間,包括無限數量的括號中的任何文本 ,只要 因爲它們都適當地配對。如果主題字符串包含 不平衡括號,則第一個正則表達式匹配是最左邊的 一對平衡括號,這可能在不平衡打開 括號後發生。如果您想要一個在 字符串中找不到包含不平衡括號的任何匹配的正則表達式,則需要使用 子例程調用而不是遞歸。如果要查找多個平衡括號對的序列 作爲單個匹配項,則您還需要調用子程序。

相關問題