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

时间:2016-03-09 07:58:38

标签: c# regex syntax-highlighting avalonedit

我在运行我自己的自定义语言的应用程序中使用AvalonEdit。我已经定义了一个可以正常工作的highlighting.xml文件。

现在我试图按照以下方式扩展它:

  

“方法”之后出现的下一个单词显示为蓝色。

我想出了这个正则表达式:

(?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>

2 个答案:

答案 0 :(得分:1)

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

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

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

如果你真的需要除空间以外的所有东西,只需使用:

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

答案 1 :(得分:1)

基于lookbehind的规则不起作用并不让我感到惊讶。语法高亮显示器只是一个美化的词法分析器,这意味着它不会像你期望的那样使用正则表达式。它不是搜索匹配,而是手动逐步执行字符串,总是表现为(1)当前位置是字符串的开头,(2)正则表达式有一个起始锚点({ {1}})在它的前面。因此,看守不是非法的,但它们不起作用;像\A这样的积极观察总是失败,负面的看守总是成功。

但是你不应该需要一个lookbehind。在lexing大多数语言中,您可以识别用户定义的名称,因为它看起来像一样,并且还没有被其他规则(字符串,注释,关键字......)使用。在您的示例中,(?<=method )viamethodon都看起来像关键字,因此它们应该包含在您的interface规则中。然后,您可以为用户定义的名称添加另一个规则,例如:

<Keywords>

(那个正则表达式只是一个猜测,但是 - 有趣的事实 - <!-- name --> <Rule foreground="DarkBlue"> \b\w+\b </Rule> 简写是为了这个目的而发明的。)如果你想区分方法名和其他名,你可以添加另一个规则在那之前,使用更具体的正则表达式:

\w

顺便说一句,<!-- method name --> <Rule foreground="LightBlue"> \b[A-Z]\w*\b </Rule> 修饰符允许点((?s))匹配任何字符,包括换行符。它可能在这里没有效果,因为荧光笔一次处理一行,但它肯定没有任何好处。