在 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 中递归地突出显示函数没有任何成功。

附言以下是我目前用来确定成功的测试。

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

平衡括号不是正则表达式,因为它需要内存(请参阅:正则表达式可以用来匹配嵌套模式吗?)。对于某些实现,正则表达式中有一个递实现:

匹配平衡结构

递归的主要目的是匹配平衡结构或 嵌套构造。通用正则表达式b(?:m|(?R))*e b的位置 构造的开始,m是中间可能发生的情况 构造,e是构造结束时可能发生的情况。为 正确的结果,bme中没有两个应该能够匹配 相同的文本。您可以使用原子组代替 用于提高性能的非捕获组:b(?>m|(?R))*e

一个常见的实际用途是匹配一组平衡的括号。 ((?>[^()]|(?R))*)将一对括号与任何 中间的文本,包括无限数量的括号,只要 因为它们都正确配对。如果主题字符串包含 括号不平衡,则第一个正则表达式匹配是最左边的 一对平衡括号,可能在不平衡打开后出现 括弧。如果您想要一个在 包含不平衡括号的字符串,则需要使用 子例程调用而不是递归。如果要查找序列 将多对平衡括号作为单个匹配项,然后您 还需要子例程调用。

好吧,看起来我正在使这比它需要的更复杂。

我能够通过这个更简单的正则表达式实现我需要的东西。我只是告诉它不要再寻找右括号了。

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

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

[已过时] '(w+()+[^)]*)+'

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

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

相关内容

  • 没有找到相关文章

最新更新