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

标签 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,但我无法想出一个正则表达式来捕获两者。

(?<!//)(\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/

相关文章:

html - 如何在 HTML 代码中注释/取消注释

python - 注释 (#) 在 Vim 的插入模式中转到行首

youtube - YouTube API如何获得评论和喜欢的回复

java - Java 中的内联注释 :/** opposed to/*?

javascript - 浏览器对具有前瞻性的正则表达式的不同解释

regex - 删除最外面的括号

java - 包含按字母顺序排列的字母的单词的正则表达式 JAVA

Java:如何替换字符串中除 [0-9] 和 "sin","cos","tan","ctg"、 "("、 ")"之外的所有内容

regex - Django urls 查询字符串的正则表达式

eclipse - 阻止 Eclipse 修改我的评论