AvalonEdit突出显示单词后面和下一个空格之前的所有内容



我在一个运行我自己定制语言的应用程序中使用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)(?&lt;=method )(.+?)(?= )
</Rule>
<Rule foreground="DarkBlue">
  (?s)(?<=method )(.+?)(?= )
</Rule>

这个没有打破突出显示,但也不起作用:

<Rule foreground="DarkBlue">
  (?s)(?&lt;=method )(.+?)(?= )
</Rule>

我想做的事情可能吗?正则表达式正确吗?我对正则表达式一无所知。

提前谢谢。

Divisadero答案更新

这些打破了突出显示。

<Rule foreground="DarkBlue">
  (?s)(?<=method )([^' ']+)
</Rule>
<Rule foreground="DarkBlue">
  (?s)(?&lt;=method )([^' ']+)
</Rule>
<Rule foreground="DarkBlue">
  (?s)(?<=method )([^' ']+)
</Rule>

这些不会破坏高亮显示,但不起作用:">

<Rule foreground="DarkBlue">
  (?s)(?&lt;=method )([^' ']+)
</Rule>

如果只想在方法后面突出显示名称,请使用:

(?s)(?<=method )([a-zA-Z0-9])+  

"[a-zA-Z0-9]+"部分应接受您在名称中接受的任何符号。

如果你真的需要除空间外的一切,只需使用:

(?s)(?<=method )([^' ']+) 

基于查找的规则不起作用并不让我感到惊讶。语法高亮器只是一个美化的lexer,这意味着它不会像您期望的那样使用正则表达式。它不是搜索匹配项,而是手动遍历字符串,始终表现为(1(当前位置是字符串的开头,(2(正则表达式的前面有一个起始锚(A(。因此,lookbehinds并不违法,但它们不起作用;像(?<=method )这样的正面观察总是失败,而负面观察总是成功。

但无论如何,你不应该需要背后的人。在大多数语言的词法分析中,您可以识别用户定义的名称,因为它看起来像一个名称,而且还没有被其他规则(字符串、注释、关键字…(使用。在您的示例中,viamethodoninterface看起来都像关键字,所以它们应该包含在<Keywords>规则中。然后,您可以为用户定义的名称添加另一条规则,如:

<!-- name -->
<Rule foreground="DarkBlue">
  bw+b
</Rule>

(这个正则表达式只是猜测,但有趣的是,w简写正是为了这个目的而发明的。(如果你想区分方法名和其他名称,你可以在这个规则之前添加另一个规则,使用一个更具体的正则表达式:

<!-- method name -->
<Rule foreground="LightBlue">
  b[A-Z]w*b
</Rule>

顺便说一下,(?s)修饰符允许点(.(匹配任何字符,包括换行符。它在这里可能没有效果,因为荧光笔一次处理一行,但它肯定没有任何好处。

相关内容

最新更新