Использование регулярного выражения для сопоставления слов в одном столбце - PullRequest
0 голосов
/ 27 июня 2019

Интересно, возможно ли это с помощью регулярного выражения в C #:

Я бы хотел сопоставить слова "FOO" и "BAR" в многострочном тексте, но только если эти два слованачинаться в одном и том же столбце на последовательных строках.

Другими словами, это должно совпадать, поскольку оба слова начинаются в одном и том же столбце:

dha skj dh FOO dd fsdf sdf \n
xdsjk fh f BAR 98kf hkjdsf \n

Это также должно совпадать, даже если есть также"BAR" в неправильном месте:

dha sk jdh FOO dd fsd fs df \n
xd BAR fhf BAR 98 kfhk jdsf \n

Это должно не совпадать, потому что слова начинаются в разных столбцах:

dhas kjdh FOO dd fsdfsd ddef \n
xdB2e ARfhf BAR 98kfh kj dsf \n

РЕДАКТИРОВАТЬ

Мне удалось получить совпадения в случае одинаковых префиксов для обоих слов, используя обратную ссылку, подобную этой:

var pattern = @"(?m)^(.*?)(FOO).*$\n^\1(BAR)" ;
var result = Regex.Match( "xxxFOOyyyy\nxxxBARzzz", pattern ) ;

Но что я действительно хочу, так это обратная ссылка на длина первой группы захвата.

1 Ответ

1 голос
/ 27 июня 2019

Вы можете использовать

(?m)^(?<o>.)*?(FOO).*\n(?<-o>.)*?(BAR)(?(o)(?!))

См. Демоверсию regex

Детали

  • (?m) - встроенная версия модификатора RegexOptions.Multiline, которая заставляет ^ соответствовать началу строки
  • ^ - начало строки
  • (?<o>.)*? - любой символ, кроме символа новой строки (LF), который помещается в стек группы o (увеличивая его) при каждой находке
  • (FOO) - Группа 1, которая соответствует FOO
  • .* - остаток строки
  • \n - новая строка
  • (?<-o>.)*? - любой символ, кроме символа новой строки (LF), который выталкивается из стека группы o (уменьшая его) при каждой находке
  • (BAR) - Группа 2: захватывает BAR подстрока
  • (?(o)(?!)) - условная конструкция, которая не совпадает, если группа o не пуста (то есть, если число символов в первой строке до FOO отличается от числа символов во второй строке до BAR).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...