使用积极前瞻的正则表达式

时间:2014-07-09 12:04:26

标签: regex lookaround

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

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),但记录数将是可变的。

任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:3)

解析数据以提取相关值

你几乎就在那里,但是需要允许前瞻跳过当前行和测试行之间的行:

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

\R匹配所有类型的换行符,(?ms)是打开多行和点匹配所有修饰符的内联方式,以便.*?^test匹配到测试对象的每一行,见demo here

同样,您的问题是\s+迫使前瞻在您匹配的那一行之后就在线上。