我需要一个正则表达式来查找未注释掉的字符串

时间:2010-09-30 09:44:47

标签: javascript regex

我的正则表达式目前是:

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")
*/

这包括初始包含字符串下的注释。

2 个答案:

答案 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上在线测试。