【问题标题】:AvalonEdit highlight everything after a word and before the next space?AvalonEdit 在一个单词之后和下一个空格之前突出显示所有内容?
【发布时间】:2016-06-23 11:55:26
【问题描述】:

我在运行我自己的定制语言的应用程序中使用 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>

【问题讨论】:

  • 在您的语言中,viamethodoninterface 是否定义为关键字?也就是说,它们是否都包含在&lt;Keywords&gt; 规则中?您是否有一般用户定义名称的规则,例如 \b\w+\b\b[A-Z]\w*\b 之类的正则表达式?
  • 只有方法和接口是绿色的关键字。文件末尾还有这条规则: \b0[xX][0-9a-fA-F]+ # hex number | \b ( \d+(\.[0-9]+)? #带可选浮点数 | \.[0-9]+ #或者只是从浮点数开始 ) ([eE][+-]?[0 -9]+)? # 可选指数

标签: c# regex syntax-highlighting avalonedit


【解决方案1】:

基于lookbehind 的规则不起作用,这并不让我感到惊讶。语法高亮器只是一个美化的词法分析器,这意味着它不会像您期望的那样使用正则表达式。它不是搜索 匹配,而是手动遍历字符串,总是表现得好像(1)当前位置是字符串的开头,(2)正则表达式有一个起始锚点(@ 987654321@) 在它的前面。因此,lookbehinds 并不违法,但它们不起作用;像(?&lt;=method ) 这样的正向回溯总是失败,而负向回溯总是成功。

但无论如何,您不应该需要回顾。在对大多数语言进行词法分析时,您可以识别用户定义的名称,因为它看起来 像一个名称,并且尚未被其他规则(字符串、注释、关键字...)使用。在您的示例中,viamethodoninterface 都看起来像关键字,因此它们应该包含在您的 &lt;Keywords&gt; 规则中。然后您可以为用户定义的名称添加另一个规则,例如:

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

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

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

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

【讨论】:

  • 非常感谢您提供的所有信息。我添加了“via”和“on”作为没有指定颜色的关键字。现在每个单词都被突出显示,即使它不在 via 和 on 之间。
  • 您正在为关键字和其他词使用不同的颜色,不是吗?还有哪些您不想突出显示的词?它们是否有不同的格式,例如大写与不大写?
  • 我正在使用 GIVEN WHEN THEN 结构,在某些时候必须声明方法和接口名称。但它不是很严格,所以人们可以写句子。我唯一知道的是,每当这个模式写成“[unit][space][%UNITNAME%][via method][%METHODNAME%][on interface][%INTERFACE NAME%]”然后我想要方法名称和不同颜色的接口名称。而“单元”、“方法”和“接口”是关键字。
  • 也许最好不要突出它们。如果您为所有关键字着色,其他词会脱颖而出,因为它们没有着色。
  • 是的,但我还实现了 CONTROL+CLICK 在当前解决方案中搜索此类方法/接口。这就是我想要反映的。由于编辑器中方法的默认颜色是黑色,我可以接受离开它,但我真的很想突出显示接口名称。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 感谢您的回答,这个正则表达式看起来更简单,它们仍然可以在regexstorm.net/tester 中使用。不幸的是,不在 highlight.xml 中。我更新了问题。
猜你喜欢
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2021-10-15
  • 1970-01-01
  • 2019-08-08
  • 2015-09-29
相关资源
最近更新 更多