我正在尝试使用语法高亮构建一个非常具体的编辑器。 我用简单的正则表达式制作了所有简单的东西,但现在我想用正则表达式添加一些高级功能。
在这种情况下,我想知道是否在任何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中完成,还是应该放弃这个想法,只考虑两步法?
答案 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
,它指的是^
和$
的匹配方式。