我有一个数据字段文件,其中可能包含注释,如下所示:
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/