是否有正则表达式匹配任何行注释,但避免字符串内的注释?
我需要//
之后的所有内容(包括//
)
例如:
//Comment (match!)
bla bla bla bla //Comment (match!)
this string "foo // foo" (don't match because it's inside "")
答案 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;
答案 1 :(得分:-1)
^[^"]*(//.*)
不会捕获所有案例,但至少你的例子应该有效
更新:开头缺少^
。
答案 2 :(得分:-1)
此正则表达式适用于所有情况(请参阅regex101 example):
(("[^"]*){2})*(\/\/.*)
您需要与第三个捕获组匹配的任何内容。或者,您可以使前两个组无法捕获。
在点击双斜线之前,它可以跳过任意偶数引号,然后跳过其他文本。
答案 3 :(得分:-1)
这是另一个应该捕获每一行注释的解决方案(请参阅regex101上的工作):
(\/\/.*)|"(?:\\"|.)*?"
所有评论都将在第一个匹配组中捕获。
它适用于任何具有惰性量词的正则表达式,这几乎都是它们。我使用的技术是专门匹配引用的字符串,以便从可用的文本中“删除”以匹配我们想要的内容:注释。 RexEgg.com上将此技术详细解释为The Greatest Regex Trick Ever。
故障:
(\/\/.*)
匹配评论和群组中的捕获
"(?:\\"|.)*?"
匹配引用的字符串,避免
(?:\\"|.)
匹配转义引号或下一个字符,成功通过转义引号,而不是将它们匹配为“真实”引用*?
懒惰量词,因此它会触及下一个“真实”引号,而不是继续使用另一个引用的字符串。