【发布时间】:2011-10-09 23:44:48
【问题描述】:
我有一个数据字段文件,其中可能包含 cmets,如下所示:
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,它是三个数据字段,但我不想捕获 cmets 中的内容。
我尝试了否定的后视来排除 105 和 106,但我无法想出一个正则表达式来捕获两者。
(?<!//)(\b\d+\b),\s(data),\s(data),\s(data)
这将捕获除 105 之外的所有捕获,但要指定
(?<!//\s*) or (?<!//.*)
因为我试图排除带有任何空格或任何字符的评论会使我的整个正则表达式无效。
我感觉我需要巧妙地使用锚点,或者我需要将我想要的内容封装在一个捕获组中并在我的后视中引用它(例如使用 $1)。
如果这是“正则表达式不支持递归”的另一种情况,因为它是一种正则语言(自动机理论),请指出。
是否可以使用正则表达式排除 103 以及第 105 和 106 行中的 cmets?如果有,怎么做?
【问题讨论】:
-
@duedl0r 这是我今天听到的最愚蠢的话。
-
@Tomalak 你能处理语言无关的抽象吗? :)
-
@duedl0r:正则表达式风格因语言而异,因此必须知道 OP 使用的是哪一种,否则特定解决方案很可能无法正常工作。跨度>
-
我正在使用 Boost C++ 1.47.0 正则表达式。
-
这里
data是什么意思(?<!//)(\b\d+\b),\s(data),\s(data),\s(data)