【问题标题】:AvalonEdit: Regex Capturing Groups in XSHD-FileAvalonEdit:正则表达式在 XSHD 文件中捕获组
【发布时间】:2011-12-14 15:47:38
【问题描述】:

我正在尝试为类似于 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 没有定义。

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

谢谢

【问题讨论】:

  • ?重复反向引用。 (?:([A-Z]{3,}))[.\n]?\1 怎么样

标签: c# regex avalonedit


【解决方案1】:

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

但是,您尝试做的事情在 AvalonEdit 中是不可能的。规则不能是多行的,span end 不能对 span start 使用反向引用。

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

【讨论】:

  • 感谢您对高亮引擎的洞察力。如果没有其他办法,我将开发一个解决方法(使用线路变压器)
【解决方案2】:
"(?:([A-Z]{3,}))(.|\n)*?\1"

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

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

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

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

【讨论】:

    【解决方案3】:

    *?

    重复反向引用。

    怎么样

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

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多