2

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

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

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

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

我已经尝试使用表达式“ Define(?<tag>\d+)(?=JumpTo\k<tag>) ”进行积极的前瞻。我希望它会找到“ Define1 ”,但它没有(无论有没有多行选项)。

这是否可以一步完成正则表达式,还是我应该放弃这个想法而只考虑两步方法?

4

1 回答 1

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指如何^$匹配。

于 2011-11-14T13:35:20.807 回答