我目前正在编辑我的javascript.lang文件以突出显示函数名称。这是我目前使用的 gtksourceview 表达式。
<define-regex id="function-regex" >
(?<=([.|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
是构造结束时可能发生的情况。为 正确的结果,b
、m
和e
中没有两个应该能够匹配 相同的文本。您可以使用原子组代替 用于提高性能的非捕获组:b(?>m|(?R))*e
。一个常见的实际用途是匹配一组平衡的括号。
((?>[^()]|(?R))*)
将一对括号与任何 中间的文本,包括无限数量的括号,只要 因为它们都正确配对。如果主题字符串包含 括号不平衡,则第一个正则表达式匹配是最左边的 一对平衡括号,可能在不平衡打开后出现 括弧。如果您想要一个在 包含不平衡括号的字符串,则需要使用 子例程调用而不是递归。如果要查找序列 将多对平衡括号作为单个匹配项,然后您 还需要子例程调用。
好吧,看起来我正在使这比它需要的更复杂。
我能够通过这个更简单的正则表达式实现我需要的东西。我只是告诉它不要再寻找右括号了。
([a-zA-Z0-9][a-zA-Z0-9]*)(?=()
以下regex
适用于嵌套函数(注意:这是regex
的python版本。您可能需要也可能不需要进行一些语法调整。希望你会明白这个想法):
[已过时] '(w+()+[^)]*)+'
[更新] (应该可以工作。希望如此)
(w+()+([^)]*)+)*