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

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

正如您在上面的第一条评论中所看到的,直接引用了一个匹配模式。现在,我想捕获103及其三个数据字段,但是我不想捕获注释中的内容。

我尝试使用负向后看来排除105和106,但是我无法提出正则表达式来同时捕获这两者。

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

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

(?<!//\s*) or (?<!//.*)

因为我尝试使用任何空格或任何字符排除注释都使我的整个正则表达式无效。

我觉得我需要巧妙地使用 anchor ,或者我需要将所需的东西包装在捕获组中,并在后面的外观中对其进行引用(例如$1)。

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

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

最佳答案

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

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

另一种方法是使用先行而不是先行:

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

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

^(\b\d +\b),\s(数据),\s(数据),\s(数据)

一些正则表达式引擎(例如.NET中的一个)支持可变长度后向查找,您的似乎不具备此功能,这就是(?<!//\s*)对您失败的原因。

关于正则表达式:匹配,但如果有注释则不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6772447/

10-13 04:38