Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正向前瞻的正则表达式_Regex_Lookaround - Fatal编程技术网

Regex 使用正向前瞻的正则表达式

Regex 使用正向前瞻的正则表达式,regex,lookaround,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”字段): 这是我开始使用的内容,并正确捕获了字段: (?<f1>.*?),(?<f2>.*?),(?<f3>.*?)\s+ (?*?)、(?*?)、

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

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”字段):

这是我开始使用的内容,并正确捕获了字段:

(?<f1>.*?),(?<f2>.*?),(?<f3>.*?)\s+
(?*?)、(?*?)、(?*?)\s+
我知道我需要使用lookarounds来捕获并在每一行中包含“test”字段

因此,添加了类似的内容(使用积极的前瞻性)

(?*?)、(?*?)、(?*?)\s+(?=test=“(?*?)
这看起来很接近,但并不是生成所有的数据行,而是只生成包含测试值的最后一行数据,就好像它正在使用前瞻行一样

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


欢迎提供任何指导。

解析数据以提取相关值

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

(?ms)(?<f1>\w+),(?<f2>\w+),(?<f3>\w+)\R(?=.*?^test="(?<test>\d+)")
(?ms)(?\w+),(?\w+),(?\w+)\R(?=.*?^test=“(?\d+”)
\R
匹配所有类型的换行符,
(?ms)
是打开多行和点匹配所有修饰符的内联方式,以便
*?^test
匹配测试行之前的每一行,请参阅


同样,您的问题是,
\s+
强制前瞻性在您匹配的前瞻性之后;上面的数据只是一个片段,对于未知和可变的行数是连续的。此外,我还需要使用捕获组来捕获每个字段。这被用作一个应用程序的输入,该应用程序将解析数据并插入数据库字段。您使用的是什么语言,您可以编辑该问题以使其更具体吗?例如,定义字段的是什么(一行,一个
a1
…),如果行数是可变的,那么逗号分隔值的数量如何,等等。接受我的正则表达式的应用程序是.NET。a1是一个字段,a2是另一个字段,a3是另一个字段,最后一个字段是测试=值。每行有4个字段。谢谢,我需要澄清并在上面添加一条评论。基于我之前应该提供的这些新信息,我不确定您的解决方案是否适合我。@user916077:编辑了我的答案。作为旁注,如果你想在你的问题中添加信息,你应该总是编辑它,而不仅仅是对它发表评论(评论只是为了传达少量的信息)。这就是,谢谢。我确实遇到了一个错误,\R因此我使用了\n,它似乎可以工作并提供我需要的结果。
(?<f1>.*?),(?<f2>.*?),(?<f3>.*?)\s+(?=test="(?<test>.*?)")
(?ms)(?<f1>\w+),(?<f2>\w+),(?<f3>\w+)\R(?=.*?^test="(?<test>\d+)")