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

Sur*_*riv 2 .net c# regex lookahead lookbehind

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

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

Define1,Command,Command
Define2,Command,Command,JumpTo4
Define3,Command,Command,JumpTo1
Define4,Command,Command
Run Code Online (Sandbox Code Playgroud)

这里的目标是要找到每一个定义(Definexxx)由一个引用JumpTo(一个或多个)可以说,它是前或后定义.在另一步骤我也想找到任何定义不是由任何引用JumpTo.

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

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

Tim*_*ker 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);
Run Code Online (Sandbox Code Playgroud)

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

此外,请注意使用该Singleline选项.这是你想要什么,而不是Multiline它指的是如何^$匹配.