正则表达式:跳过引号内的注释

时间:2017-11-05 02:56:17

标签: javascript node.js regex

使用此正则表达式 /#(.*?)\r?\n|#(.*?)$/g 我可以解析下面的内容,但它也匹配引号内的注释。

我该如何避免这种情况?

#
# this is a comment
#

but this is '# not a comment'
and this is "# not a comment either"

# help, please

我尝试了 /(?!\B["'][^']*)(#(.*?)\r?\n|#(.*?)$)(?![^']*['"]\B)/g  但结果是错误的。

有任何帮助吗?

2 个答案:

答案 0 :(得分:1)

尝试使用此简单代码仅在行的开头匹配注释

/^#(.*?)$/gm

演示:https://regex101.com/r/YngpW9/1/

在任何地方匹配评论的替代代码

/^[^'"]*?(#.*?)$/gm

演示:https://regex101.com/r/YngpW9/2/

请务必使用gm,而不只是g,以便您可以使用与行首相匹配的^

这是一个例子

var string = `
#
# this is a comment
#

but this is '# not a comment'
and this is "# not a comment either"

# help, please
`;
var regex = /^[^'"]*?(#.*?)$/gm;
var match = regex.exec(string);
while (match != null) {
  document.write(match[1]+'<br>')
  match = regex.exec(string);
}

答案 1 :(得分:1)

实现此目的的一种方法是使用捕获组和交替来区分您想要的上下文和您不想要的上下文。这是我从this article学到的一种技术。

诀窍是只将想要匹配的东西放在捕获组中,并将所有其他替代项留在捕获组之外。然后,您将根据是否有捕获组过滤结果匹配。

正则表达式看起来像这样:

/'(?:\\.|.)*?'|"(?:\\.|.)*?"|#(.*)$/gm

Regex101 Demo

您可以这样使用它:

var re = /'(?:\\.|.)*?'|"(?:\\.|.)*?"|#(.*)$/gm;
var str = `
#
# this is a comment
#

but this is '# not a comment'
and this is "# not a comment either"

# help, please
`;

str.replace(re, function(match, group1) {
  if (group1 !== undefined) {
    console.log(match);
  }
});

你甚至可以extend this to match multi-line comments

var re = /'(?:\\.|.)*?'|"(?:\\.|.)*?"|(#(.*)$|\/\*([\s\S]*?)\*\/)/gm;
var str = `
#
# this is a comment
#

/*
this is a
multiline comment
*/

but this is '# not a comment'
and this is "# not /* a comment */ either"

# help, please
`;

str.replace(re, function(match, group1) {
  if (group1 !== undefined) {
    console.log(match);
  }
});