我的源数据文本如下所示:
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+
我知道我需要使用lookarounds来捕获并在每一行中包含“test”字段。
所以添加了这样的东西(使用积极的前瞻)......
(?<f1>.*?),(?<f2>.*?),(?<f3>.*?)\s+(?=test="(?<test>.*?)")
这似乎很接近,但并没有产生所有数据行,而是只包含包含测试值的最后一行数据,就好像它消耗了前瞻行一样。
此表达式及其捕获的组被输入到.NET应用程序中,该应用程序将这些捕获的组作为字段插入数据库表中。字段数始终是静态的(上例中为4; field1 = f1,field2 = f2,field3 = f3,field4 = test),但记录数将是可变的。
任何指导都将不胜感激。
答案 0 :(得分:3)
解析数据以提取相关值
你几乎就在那里,但是需要允许前瞻跳过当前行和测试行之间的行:
(?ms)(?<f1>\w+),(?<f2>\w+),(?<f3>\w+)\R(?=.*?^test="(?<test>\d+)")
\R
匹配所有类型的换行符,(?ms)
是打开多行和点匹配所有修饰符的内联方式,以便.*?^test
匹配到测试对象的每一行,见demo here。
同样,您的问题是\s+
迫使前瞻在您匹配的那一行之后就在线上。