正则表达式?不起作用

时间:2016-07-01 09:57:00

标签: javascript regex node.js browser

var contents = [];
contents.push('\r\n"use strict";');
contents.push('\n"use strict";');

var useStrictRegExp = /([^{]\r?\n)['"]use strict['"];/g;

for (var i = 0; i < contents.length; ++i) {
  var content = contents[i];
  console.log('before', content);
  var replaced = content.replace(useStrictRegExp, '$1');
  console.log('after', replaced);
}

这意味着匹配"use strict";不在括号内。

但是在不使用Windows行结尾时似乎失败了。输出是:

before 
"use strict";
after 

before 
"use strict";
after 
"use strict";

我不知道为什么。

2 个答案:

答案 0 :(得分:1)

问题是您需要在{之前显示不\n的字符。在第一个中有\r,然后没有\r\n匹配,所以一切都很好。

在第二个字符中,您获得第一个字符\n,然后没有\n匹配,因此它失败了。

您可能希望使用look look来检查之前是否存在{,而不需要存在字符。这不足以在适当的上下文中正确检查"use strict";的存在,但对您来说可能已经足够了。

答案 1 :(得分:1)

关于@Sami的答案,这是完全正确的(你检查一个字符后面跟一个回车/换行,并且在你的输入中从未发生),它看起来更需要一个否定的断言而不是匹配单个字符。 @Sami使用lookbehind提供,直到您的问号,您只能使用前瞻:(?!{)

/((?!{)\r?\n)['"]use strict['"];/g

var contents = [];
contents.push('\r\n"use strict";');
contents.push('\n"use strict";');
contents.push('{\n"use strict";');

var useStrictRegExp = /((?!{)\r?\n)['"]use strict['"];/g;

for (var i = 0; i < contents.length; ++i) {
  var content = contents[i];
  console.log('before', content);
  var replaced = content.replace(useStrictRegExp, '$1');
  console.log('after', replaced);
}