正则表达式源代码注释

时间:2014-12-17 20:13:47

标签: c++ regex comments

是否有正则表达式匹配任何行注释,但避免字符串内的注释? 我需要//之后的所有内容(包括//

例如:

//Comment (match!)
bla bla bla bla //Comment (match!)
this string "foo // foo" (don't match because it's inside "")

4 个答案:

答案 0 :(得分:1)

以下regular expression将正确匹配输入中的任何字符串和正则表达式:

var strings = /("((.|\\\n)*?([^\\"]|\\\\)|)"|'((.|\\\n)*?([^\\']|\\\\)|)'|\/[^*](.*([^\\\/]|\\\\))\/|\/\*\/)/g;

您可以从输入中删除字符串,然后使用another regular expression匹配评论:

var comments = /((\/\/)(.*)|(\/\*)((.|\n)*)(\*\/))/g;
input.replace(strings, "").match(comments);



var strings = /("((.|\\\n)*?([^\\"]|\\\\)|)"|'((.|\\\n)*?([^\\']|\\\\)|)'|\/[^*](.*([^\\\/]|\\\\))\/|\/\*\/)/g,
    comments = /((\/\/)(.*)|(\/\*)((.|\n)*)(\*\/))/g;

function update() {
  var arr = input.value.replace(strings, "").match(comments);
  output.value = arr ? arr.join("\n") : "";
}

input.onkeydown = input.onkeyup = input.onchange = update;
update();

textarea {
  width: 90%;
  height: 5em;
}

<p>Input:</p>
<textarea id="input">
//Comment (match!)
bla bla bla bla //Comment (match!)
this string "foo // foo"
</textarea>

<p>Output:</p>
<textarea id="output">
</textarea>
&#13;
&#13;
&#13;

答案 1 :(得分:-1)

^[^"]*(//.*)

不会捕获所有案例,但至少你的例子应该有效

更新:开头缺少^

答案 2 :(得分:-1)

此正则表达式适用于所有情况(请参阅regex101 example):

(("[^"]*){2})*(\/\/.*)

您需要与第三个捕获组匹配的任何内容。或者,您可以使前两个组无法捕获。

在点击双斜线之前,它可以跳过任意偶数引号,然后跳过其他文本。

答案 3 :(得分:-1)

这是另一个应该捕获每一行注释的解决方案(请参阅regex101上的工作):

(\/\/.*)|"(?:\\"|.)*?"

所有评论都将在第一个匹配组中捕获。

它适用于任何具有惰性量词的正则表达式,这几乎都是它们。我使用的技术是专门匹配引用的字符串,以便从可用的文本中“删除”以匹配我们想要的内容:注释。 RexEgg.com上将此技术详细解释为The Greatest Regex Trick Ever

故障:

(\/\/.*)匹配评论和群组中的捕获

"(?:\\"|.)*?"匹配引用的字符串,避免

中的任何转义引号
  • 内部非捕获组(?:\\"|.)匹配转义引号或下一个字符,成功通过转义引号,而不是将它们匹配为“真实”引用
  • 整个轮换具有*?懒惰量词,因此它会触及下一个“真实”引号,而不是继续使用另一个引用的字符串。