正则表达式:匹配,但不在评论中

Mat*_*ton 8 regex comments

我有一个数据字段文件,可能包含注释,如下所示:

id, data, data, data
101 a, b, c
102 d, e, f
103 g, h, i // has to do with 101 a, b, c
104 j, k, l
//105 m, n, o
// 106 p, q, r
Run Code Online (Sandbox Code Playgroud)

正如您在上面的第一条评论中所看到的,可以直接引用匹配模式.现在,我想捕获103和它的三个数据字段,但我不想捕获评论中的内容.

我已经尝试过消极的lookbehind来排除105和106,但我无法想出一个正则表达式来捕获它们.

(?<!//)(\b\d+\b),\s(data),\s(data),\s(data)
Run Code Online (Sandbox Code Playgroud)

这将捕获所有但不包括105的捕获,但要指定

(?<!//\s*) or (?<!//.*)
Run Code Online (Sandbox Code Playgroud)

因为我试图用任何空格或任何字符排除评论会使我的整个正则表达式无效.

我有一种感觉,我需要一个狡猾的锚点使用,或者我需要在捕获组中包装我想要的东西并$1在我的lookbehind中引用它(比如).


如果这是"正则表达式不支持递归"的另一种情况,因为它是一种常规语言(自动机理论),请指出.

是否可以使用正则表达式排除103和第105和106行中的注释?如果是这样,怎么样?

Tom*_*lak 6

最简单的方法是\s*//.*在开始之前用空字符串替换.

这将从您的输入中删除所有(单行)注释,您可以继续使用一个简单的表达式来匹配您想要的实际内容.

替代方案是使用预测而不是后视:

^(?!//)(\b\d+\b),\s(data),\s(data),\s(data)

在你的情况下它甚至可以只是锚定正则表达式,因为很明显,一行上的第一件事必须是一个数字:

^(\b\d+\b),\s(data),\s(data),\s(data)

一些正则表达式引擎(例如.NET中的引擎)支持可变长度的后视,你似乎不具备此功能,这就是为什么(?<!//\s*)失败的原因.