Regex 正则表达式:匹配,但如果在注释中则不匹配

Regex 正则表达式:匹配,但如果在注释中则不匹配,regex,comments,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 正如您在上面的第一条注释中所看到的,有对匹配模式的直接引用。现在,我想捕获103,它是三个数据字段,但我不想捕获注释中的内容 我已经尝试过将105和106排除在外,但我无法用正则表达式来同时

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

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排除在外,但我无法用正则表达式来同时捕获这两个变量

(?
这将捕获除105之外的所有内容,但要指定

(?
因为我试图排除带有任何空格或任何字符的注释会使我的整个正则表达式无效

我有一种感觉,我需要巧妙地使用锚,或者我需要在捕获组中包装我想要的内容,并在我的lookback中引用它(如使用
$1


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


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

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

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

另一种方法是使用“向前看”而不是“向后看”:

^(?!//)(\b\d+\b),\s(data),\s(data),\s(data) ^(?!/)(\b\d+\b),\s(数据),\s(数据),\s(数据) 在您的情况下,只锚定正则表达式甚至会起作用,因为很明显,行上的第一件事必须是数字:

^(\b\d+\b),\s(data),\s(data),\s(data) ^(\b\d+\b),\s(数据),\s(数据),\s(数据)
一些正则表达式引擎(例如.NET中的一个)支持可变长度的look behinds,而您的似乎无法做到这一点,这就是为什么
(?对您来说失败。

在我看来,您可以将表达式锚定在行的开头(以获取所有数据):


或者,您可以使用适当的CSV解析器来处理注释。

您可以简单地将正则表达式锚定到行的开头:

(?m)^(\d+),\s(\S+),\s(\S+),\s(\S+)

我刚才在文本编辑器中使用的另一种方法是,当您没有regex的“向前看/向后看”功能时,只需使用以下序列:

^[^\r\n/]*(/[^/])?[^\r\n/]*(/[^/])?my_search_sequence
它将忽略由最多2个非
/
字符拆分的
/
序列。如果需要更多,只需添加更多:

^[^\r\n/]*(/[^/])?[^\r\n/]*(/[^/])?[^\r\n/]*(/[^/])my_search_sequence
等等


随着正则表达式的长度,你的搜索词出现在序列后面的概率确实会降低。

@duedl0r这是我今天听到的最愚蠢的事情。@Tomalak你能处理独立于语言的抽象吗?:)RuEX调味料在语言之间变化很大,因此必须知道OP使用的是什么,否则,特定的解决方案将无法工作。我使用Boost C++ +1.47.0正则表达式。<代码> ^((!)//)(\b\d+b)、< /> >和<代码> ^(\b\d+b)、< /C> >与<> >(\d+)完全相同。,
-
\b
当你在一行的开头或者在一个数字和一个逗号之间时会匹配。而且,
(?!/)\d
是一种安全的赌注
:)
@Kobi:是的,我也明白了这一点。;)但更一般地说,如果你不知道接下来会发生什么,消极的展望才是正确的方向。
^[^\r\n/]*(/[^/])?[^\r\n/]*(/[^/])?[^\r\n/]*(/[^/])my_search_sequence