Регулярное выражение с использованием положительного взгляда
Мой исходный текст данных выглядит примерно так:
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+
заставил предвидеть быть на линии сразу после того, с которым вы подходили.