我正在尝试为类似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未定义。
有人知道原因吗?以及如何实现匹配?
谢谢
答案 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