Регулярное выражение с использованием положительного взгляда

Мой исходный текст данных выглядит примерно так:

a1,a2,a3
a4,a5,a6
a7,a8,a9
test="1"
b1,b2,b3
b4,b5,b6
b7,b8,b9
test="2"
c1,c2,c3
c4,c5,c6
c7,c8,c9
test="3"

Мне нужно проанализировать это так, чтобы конечный результат выглядел следующим образом (соответствующее поле "test" включено в каждую строку):

a1,a2,a3,1
a4,a5,a6,1
a7,a8,a9,1
b1,b2,b3,2
b4,b5,b6,2
b7,b8,b9,2
c1,c2,c3,3
c4,c5,c6,3
c7,c8,c9,3
...etc

это то, с чего я начал и правильно захватывает поля:

(?<f1>.*?),(?<f2>.*?),(?<f3>.*?)\s+

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

Так что-то вроде этого добавлено (используя позитивный взгляд)…

(?<f1>.*?),(?<f2>.*?),(?<f3>.*?)\s+(?=test="(?<test>.*?)")

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

Это выражение с его захваченными группами вводится в приложение.NET, которое вставляет эти захваченные группы как поля в таблицу базы данных. Количество полей всегда статично (4 в примере выше; field1=f1, field2=f2, field3=f3, field4=test), но количество записей будет переменным.

Любое руководство будет оценено.

1 ответ

Решение

Анализ ваших данных для извлечения соответствующих значений

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

(?ms)(?<f1>\w+),(?<f2>\w+),(?<f3>\w+)\R(?=.*?^test="(?<test>\d+)")

\R соответствует всем видам новых строк, (?ms) это встроенный способ включения многострочного и точечного соответствия всех модификаторов, так что .*?^test соответствует каждой строке до тестовой, см. демо здесь.

Опять же, ваша проблема была в том, что \s+ заставил предвидеть быть на линии сразу после того, с которым вы подходили.

Другие вопросы по тегам