1

我的源数据文本如下所示:

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"

我需要对其进行解析,以便最终结果如下所示(每行中包含适当的“测试”字段):

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+

我知道我需要使用环视来捕获并包含每行的“测试”字段。

所以添加了这样的东西(使用积极的前瞻)......</p>

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

这似乎很接近,但并未产生所有数据行,而是仅产生包含测试值的最后一行数据,就好像它正在消耗前瞻行一样。

将该表达式及其捕获的组输入到 .NET 应用程序中,该应用程序将这些捕获的组作为字段插入到数据库表中。字段数始终是静态的(上例中为 4;field1=f1,field2=f2,field3=f3,field4=test),但记录数是可变的。

任何指导将不胜感激。

4

1 回答 1

3

解析数据以提取相关值

您快到了,但需要允许向前看以跳过当前行和测试行之间的行:

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

\R匹配所有类型的换行符,(?ms)是打开多行和点匹配所有修饰符的内联方式,以便.*?^test匹配每一行直到测试行,请参见此处的演示

同样,您的问题是,\s+在您匹配的那个之后,强制前瞻就在线上。

于 2014-07-09T12:24:33.010 回答