我在运行我自己的自定义语言的应用程序中使用AvalonEdit。我已经定义了一个可以正常工作的highlighting.xml文件。
现在我试图按照以下方式扩展它:
“方法”之后出现的下一个单词显示为蓝色。
我想出了这个正则表达式:
(?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>
我想做的是什么? 正则表达式是正确的吗?我对正则表达式完全无知。
提前致谢。
这突破了突出显示。
<Rule foreground="DarkBlue">
\(?s)(?<=method )([^' ']+)
</Rule>
<Rule foreground="DarkBlue">
\(?s)(?<=method )([^' ']+)
</Rule>
<Rule foreground="DarkBlue">
(?s)(?<=method )([^' ']+)
</Rule>
这些不会破坏突出显示但不起作用:“
<Rule foreground="DarkBlue">
(?s)(?<=method )([^' ']+)
</Rule>
答案 0 :(得分:1)
如果您只想在方法后突出显示名称,请使用:
(?s)(?<=method )([a-zA-Z0-9])+
'[a-zA-Z0-9] +'部分应接受您在名称中接受的任何符号。
如果你真的需要除空间以外的所有东西,只需使用:
(?s)(?<=method )([^' ']+)
答案 1 :(得分:1)
基于lookbehind的规则不起作用并不让我感到惊讶。语法高亮显示器只是一个美化的词法分析器,这意味着它不会像你期望的那样使用正则表达式。它不是搜索匹配,而是手动逐步执行字符串,总是表现为(1)当前位置是字符串的开头,(2)正则表达式有一个起始锚点({ {1}})在它的前面。因此,看守不是非法的,但它们不起作用;像\A
这样的积极观察总是失败,负面的看守总是成功。
但是你不应该需要一个lookbehind。在lexing大多数语言中,您可以识别用户定义的名称,因为它看起来像一样,并且还没有被其他规则(字符串,注释,关键字......)使用。在您的示例中,(?<=method )
,via
,method
和on
都看起来像关键字,因此它们应该包含在您的interface
规则中。然后,您可以为用户定义的名称添加另一个规则,例如:
<Keywords>
(那个正则表达式只是一个猜测,但是 - 有趣的事实 - <!-- name -->
<Rule foreground="DarkBlue">
\b\w+\b
</Rule>
简写是为了这个目的而发明的。)如果你想区分方法名和其他名,你可以添加另一个规则在那之前,使用更具体的正则表达式:
\w
顺便说一句,<!-- method name -->
<Rule foreground="LightBlue">
\b[A-Z]\w*\b
</Rule>
修饰符允许点((?s)
)匹配任何字符,包括换行符。它可能在这里没有效果,因为荧光笔一次处理一行,但它肯定没有任何好处。