在gedit中,突出显示括号内的函数调用

时间:2014-03-30 06:12:22

标签: regex recursion syntax-highlighting gedit

我目前正在编辑我的javascript.lang文件以突出显示函数名称。 这是我目前正在使用的gtksourceview的表达式。

<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,bar,baz等等。

我不知道如何处理条形功能。我已经阅读了一种使用(?R)或(?0)递归执行正则表达式的方法,但是我没有成功使用它在gedit中递归地突出显示函数。

P.S。 以下是我目前用于确定成功的测试。

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

3 个答案:

答案 0 :(得分:1)

平衡括号不是正则表达式,因为它需要内存(参见:Can regular expressions be used to match nested patterns?)。对于某些实现,有recursion in regular expressions的实现:

  

匹配均衡的构造

     

递归的主要目的是匹配平衡结构或   嵌套构造。通用正则表达式为b(?:m|(?R))*e,其中bm   什么开始构造,e是可以发生在中间的   构造,b是构造结束时可能发生的事情。对于   正确的结果,meb(?>m|(?R))*e中的任何两个都不应该匹配   同一文字。您可以使用原子组而不是   非捕获组以提高性能:\((?>[^()]|(?R))*\)

     

一个常见的现实世界用途是匹配一组平衡的括号。   {{1}}将一对括号与任意一对匹配   中间的文本,包括无限数量的括号,长   因为它们都是正确配对的。如果主题字符串包含   不平衡的括号,然后第一个正则表达式匹配是最左边的   一对平衡括号,可能在不平衡开启后出现   括弧。如果你想要一个没有找到任何匹配的正则表达式   包含不平衡括号的字符串,则需要使用a   子程序调用而不是递归。如果你想找到一个序列   多对平衡括号作为单个匹配,然后你   还需要一个子程序调用。

答案 1 :(得分:1)

好吧,看起来我让它变得比它需要的更复杂。

通过这个简单的正则表达式,我能够实现我所需要的。我只是告诉它停止寻找近似括号。

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

答案 2 :(得分:0)

以下regex适用于嵌套函数(注意:这是regex的python版本。您可能需要也可能不需要进行一些语法调整.Hopefull,你会得到这个想法) :

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

[更新](应该工作。希望如此)

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