Regex положительный взгляд с обратной ссылкой - PullRequest
2 голосов
/ 14 ноября 2011

Я пытаюсь создать очень специфический редактор с подсветкой синтаксиса. Я сделал все простые вещи с помощью регулярных выражений, которые были достаточно простыми, но теперь я хотел бы добавить некоторые расширенные функции также с регулярными выражениями.

В этом случае я хотел бы знать, используется ли определенный тег в любой команде JumpTo или нет.
Пример:

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

Целью здесь было бы найти каждое Define (Definexxx), на которое ссылается JumpTo (один или несколько), может ли оно быть до или после определения. В другом шаге я также хотел бы найти любой Определить , на который не ссылается ни один JumpTo .

Я пробовал выражение " Определить (? \ d +) (? = JumpTo \ k ) " для позитивного взгляда. Я ожидаю, что он найдет « Define1 », но не нашел (ни с многострочным, ни без него).

Возможно ли это сделать за один шаг Regex, или я должен отказаться от идеи и просто рассмотреть двухэтапный подход?

1 Ответ

8 голосов
/ 14 ноября 2011

Вы были почти там, просто забыли .*. И я добавил проверочное утверждение, чтобы также проверить перед текущим определением:

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, что означает совпадение ^ и $.

...