我的正则表达式目前是:
includes.push\("([^\"\"]*\.js)"\)
但它匹配以下所有行
/*includes.push("javascriptfile.js")*/
/*
includes.push("javascriptfile.js")
*/
includes.push("javascriptfile.js");
includes.push("javascriptfile.js")
我不希望它与评论中的行匹配。
那里的任何正则表达专家有什么想法吗?
谢谢:o)
编辑我测试了一个略微改编自madgnome的正则表达式。这在我的测试中选择多行的,你能看到它的任何问题吗?
includes\.push("([^\"\"]*\.js)")(?!\n**/)
新测试是:
/*includes.push("javascriptfile.js")*/
/*
includes.push("javascriptfile.js")
*/
includes.push("javascriptfile.js");
includes.push("javascriptfile.js");
/*includes.push("javascriptfile.js")*/
/*
includes.push("javascriptfile.js")
*/
这包括初始包含字符串下的注释。
答案 0 :(得分:2)
根据您的语言,您可以使用负面的lookbehind / lookahead
(?<!/\*)includes\.push\("([^\"\"]*\.js)"\)(?!\*/)
(?<!/\*)
声称在当前位置之前无法匹配正则表达式/\*
(?!\*/)
声称在当前位置之后无法匹配正则表达式\*/
此正则表达式不适用于第二个示例之类的多行注释,您应该在使用前修剪。
编辑:您使用的是javascript,而负面的lookbehind在javascript中不起作用,您只能使用负面的前瞻:
includes\.push\("([^\"\"]*\.js)"\)(?![\r\n\s]*\*/)
(此正则表达式适用于多行评论,例如您的第二个示例,但不会出现格式错误的评论:*/
没有/*
)
答案 1 :(得分:0)
您可以匹配评论(多行或单行)或字符串文字并检查整个匹配数组:
var text =
"// \"foo\" \n" +
"var s = \"no /* comment */ in here \"; \n" +
"/*includes.push(\"javascriptfileA.js\")*/\n" +
"/*\n" +
"includes.push(\"javascriptfileB.js\")\n" +
"*/\n" +
"includes.push(\"javascriptfileC.js\");\n" +
"includes.push(\"javascriptfileD.js\")\n";
print("--------------------------------------\ntext:\n");
var hits = text.match(/\/\/[^\r\n]*|\/\*[\s\S]*?\*\/|"(?:\\.|[^\\"])*"/g);
print(text);
print("--------------------------------------\nhits:\n");
for(i in hits) {
var hit = hits[i];
if(hit.indexOf("\"") == 0) {
print(hit);
}
}
产生
--------------------------------------
text:
// "foo"
var s = "no /* comment */ in here ";
/*includes.push("javascriptfileA.js")*/
/*
includes.push("javascriptfileB.js")
*/
includes.push("javascriptfileC.js");
includes.push("javascriptfileD.js")
--------------------------------------
hits:
"no /* comment */ in here "
"javascriptfileC.js"
"javascriptfileD.js"
正则表达式的简短说明:
//[^\r\n]* # match a single line comment
| # OR
/\*[\s\S]*?\*/ # match a multi-line comment
| # OR
"(?:\\.|[^\\"])*" # match a string literal
在IDEone上在线测试。