具有反向引用的正则表达式正向前瞻

时间:2011-11-14 13:31:08

标签: c# .net regex lookahead lookbehind

我正在尝试使用语法高亮构建一个非常具体的编辑器。 我用简单的正则表达式制作了所有简单的东西,但现在我想用正则表达式添加一些高级功能。

在这种情况下,我想知道是否在任何JumpTo命令上使用了已定义的标签 例如:

Define1,Command,Command
Define2,Command,Command,JumpTo4
Define3,Command,Command,JumpTo1
Define4,Command,Command

这里的目标是找到 JumpTo 引用的每个 Define (Definexxx)(一个或多个)可能在定义之前或之后。 在另一个步骤中,我还想找到任何定义,它不会被任何 JumpTo 引用。

我已经尝试过表达“定义(?< tag> \ d +)(?= JumpTo \ k< tag>)”以获得积极的前瞻性。我希望它会找到“ Define1 ”,但它没有(无论是否有多行选项)。

这可以在一步Regex中完成,还是应该放弃这个想法,只考虑两步法?

1 个答案:

答案 0 :(得分:8)

你快到了,忘了.*。我还添加了一个lookbehind断言,以便在当前定义之前检查:

Regex regexObj = new Regex(
    @"Define(?<tag>\d+\b)       # Match Define<number>
    (?:                         # Match either...
     (?=.*JumpTo\k<tag>\b)      # if JumpTo<number> occurs somewhere ahead 
    |                           # or...
     (?<=JumpTo\k<tag>\b.*)     # if JumpTo<number> occurs somewhere before 
    )                           # End of alternation", 
    RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);

我添加了\b字边界锚,以确保我们始终匹配整个数字(如果我们达到Define10及以上,这就变得很重要。)

另外,请注意使用Singleline选项。这是您想要的,而不是Multiline,它指的是^$的匹配方式。