1

我正在尝试实现类似于 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.

它说 groupnumber 1 没有定义。

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

谢谢你

4

3 回答 3

2

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

但是,您尝试做的事情在 AvalonEdit 中是不可能的。规则不能是多行的,跨度结束不能对跨度开始使用反向引用。

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

于 2011-12-15T10:03:56.003 回答
1
"(?:([A-Z]{3,}))(.|\n)*?\1"

嗯,第一个括号(?第二个括号,你想成为第 1 组,在那个里面:([A-Z]{3,}). 说“不记得里面有什么”似乎是合乎逻辑的,它不会。

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

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

就您的第三组而言,(.|\n)*?您在其中一次使用了分组+交替+量词,我不知道如果您尝试在原始表达式中访问它,\3 可能是什么:[.\n]*?应该没问题。

于 2011-12-14T18:15:22.533 回答
0

*?

重复反向引用。

怎么样

(?:([AZ]{3,}))[.\n]*?\1

于 2011-12-14T16:23:27.580 回答