AvalonEdit: Regex捕获组在xshd文件
本文关键字:xshd 文件 Regex AvalonEdit | 更新日期: 2023-09-27 18:18:03
我正在尝试实现类似于docc的语法的语法高亮显示。因此,我必须捕获起始名称。但我失败了(尝试它在一个规则和跨度)。这是我的正则表达式:
(?:([A-Z]{3,}))(.|'n)*?'1
正则表达式在正则表达式测试器中工作。
但是如果我把它放在xshd定义我得到错误:
Error at line 128:
"(?:([A-Z]{3,}))(.|'n)*?'1" wird analysiert - Verweis auf die nicht definierte Gruppenzahl 1.
表示groupnumber 1没有定义。
有人知道原因吗?如何实现匹配?
谢谢
AvalonEdit使用RegexOptions.ExplicitCapture
,因此您必须使用命名捕获组。
然而,你要做的是不可能在AvalonEdit。规则不能是多行,并且跨度的结束不能反向引用到跨度的开始。
这是因为高亮显示引擎单独高亮显示每一行,并且只会在用户编辑文本时重新高亮显示更改的行。为了支持HEREDOC结构,AvalonEdit需要将命名的捕获组的结果存储为span堆栈的一部分,并且需要支持一些特殊的语法,以便span end正则表达式可以使用对这些存储结果的反向引用。
"(?:([A-Z]{3,}))(.|'n)*?'1"
嗯,第一个括号(?:)是一个非捕获组,用于当你想分组时(比如对于|操作符),但你不关心"记住"它。第二个括号,你想要的第一组,在里面,([A-Z]{3,})
。如果你说"不记得这里面是什么",它就不会这么做,这似乎是合乎逻辑的。
无论如何,在外部不捕获的情况下,双组的意义是什么?(当你不指定数量词序列的第二部分时,也不需要逗号)你不能直接说:
"([A-Z]{3})[.'n]*?'1" //now '1 is defined?
至于你的第三组,(.|'n)*?
,其中你一次使用分组+交替+量词,那么我不知道'3可能是什么,如果你试图在原始表达式中访问它:[.'n]*?
应该是好的。
* ?
重复反向引用本身。
(?: ([a - z] {3})) (' n]。* ?' 1