AvalonEdit:正则表达式捕获XSHD文件中的组

时间:2011-12-14 15:47:39

标签: c# regex avalonedit

我正在尝试为类似Heredoc的语法实现语法高亮显示。因此我必须捕获起始名称。但我失败了(在规则和跨度中尝试)。这是我的正则表达式:

(?:([A-Z]{3,}))(.|\n)*?\1

正则表达式适用于正则表达式测试程序。

但如果我把它放在XSHD-Definition中我会得到错误:

Error at line 128:
"(?:([A-Z]{3,}))(.|\n)*?\1" wird analysiert - Verweis auf die nicht definierte Gruppenzahl 1.

它表示组号1未定义。

有人知道原因吗?以及如何实现匹配?

谢谢

3 个答案:

答案 0 :(得分:2)

AvalonEdit正在使用RegexOptions.ExplicitCapture,因此您必须使用命名捕获组。

但是,您在AvalonEdit中无法做到的事情。规则不能是多行的,并且跨度末端不能使用反向扩展到跨度开始。

这是因为突出显示引擎会单独突出显示每一行,并且只会在用户编辑文本时重新突出显示更改的行。 为了支持HEREDOC结构,AvalonEdit需要将命名捕获组的结果存储为span堆栈的一部分,并且需要支持一些特殊语法,以便span end regex可以使用对这些存储结果的反向引用。

答案 1 :(得分:1)

"(?:([A-Z]{3,}))(.|\n)*?\1"

嗯,第一个括号(?:)是一个非捕获组,当你想要分组时(例如对于|运算符),但是你不在乎“记住”它。第二个括号内容,你想成为第一组的内容,就在那个内部:([A-Z]{3,})。通过说“不记得这里面是什么”这似乎是合乎逻辑的,它不会。

无论如何,双重组的重点是什么,外部是非捕获? (当你没有指定量词序列的第二部分时也不需要逗号)你不能只说:

"([A-Z]{3})[.\n]*?\1"   //now \1 is defined?

至于你的THIRD组(.|\n)*?,你曾经同时使用了分组+交替+量词,我不知道如果你试图用原来的方式访问它可能是什么表达式:[.\n]*?应该没问题。

答案 2 :(得分:0)

  

*?

重复背面参考。

怎么样

  

(?:([A-Z] {3,}))[\ n]的?* \ 1