我在一个运行我自己定制语言的应用程序中使用AvalonEdit。我已经定义了一个highlighting.xml文件,它工作得很好。
现在我正试图根据扩展它
出现在"method"后面的下一个单词是蓝色的。
我想出了这样一个正则表达式:
(?s)(?<=method )(.+?)(?= )
并用这个输入进行了测试:
via method AMethod on interface
哪个适用http://regexstorm.net/tester.
然后我尝试了以下规则,但都不起作用。有了它们,就再也不会突出显示任何内容。
<Rule foreground="DarkBlue">
(?s)(?<=method )(.+?)(?= )
</Rule>
<Rule foreground="DarkBlue">
(?s)(?<=method )(.+?)(?= )
</Rule>
<Rule foreground="DarkBlue">
(?s)(?<=method )(.+?)(?= )
</Rule>
这个没有打破突出显示,但也不起作用:
<Rule foreground="DarkBlue">
(?s)(?<=method )(.+?)(?= )
</Rule>
我想做的事情可能吗?正则表达式正确吗?我对正则表达式一无所知。
提前谢谢。
Divisadero答案更新
这些打破了突出显示。
<Rule foreground="DarkBlue">
(?s)(?<=method )([^' ']+)
</Rule>
<Rule foreground="DarkBlue">
(?s)(?<=method )([^' ']+)
</Rule>
<Rule foreground="DarkBlue">
(?s)(?<=method )([^' ']+)
</Rule>
这些不会破坏高亮显示,但不起作用:">
<Rule foreground="DarkBlue">
(?s)(?<=method )([^' ']+)
</Rule>
如果只想在方法后面突出显示名称,请使用:
(?s)(?<=method )([a-zA-Z0-9])+
"[a-zA-Z0-9]+"部分应接受您在名称中接受的任何符号。
如果你真的需要除空间外的一切,只需使用:
(?s)(?<=method )([^' ']+)
基于查找的规则不起作用并不让我感到惊讶。语法高亮器只是一个美化的lexer,这意味着它不会像您期望的那样使用正则表达式。它不是搜索匹配项,而是手动遍历字符串,始终表现为(1(当前位置是字符串的开头,(2(正则表达式的前面有一个起始锚(A
(。因此,lookbehinds并不违法,但它们不起作用;像(?<=method )
这样的正面观察总是失败,而负面观察总是成功。
但无论如何,你不应该需要背后的人。在大多数语言的词法分析中,您可以识别用户定义的名称,因为它看起来像一个名称,而且还没有被其他规则(字符串、注释、关键字…(使用。在您的示例中,via
、method
、on
和interface
看起来都像关键字,所以它们应该包含在<Keywords>
规则中。然后,您可以为用户定义的名称添加另一条规则,如:
<!-- name -->
<Rule foreground="DarkBlue">
bw+b
</Rule>
(这个正则表达式只是猜测,但有趣的是,w
简写正是为了这个目的而发明的。(如果你想区分方法名和其他名称,你可以在这个规则之前添加另一个规则,使用一个更具体的正则表达式:
<!-- method name -->
<Rule foreground="LightBlue">
b[A-Z]w*b
</Rule>
顺便说一下,(?s)
修饰符允许点(.
(匹配任何字符,包括换行符。它在这里可能没有效果,因为荧光笔一次处理一行,但它肯定没有任何好处。