正则表达式?不工作

Regex ? does not work

本文关键字:工作 正则表达式      更新时间:2023-09-26
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";

我不知道为什么。

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

/((?!{)'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);
}

问题是您需要一个字符不是{出现在'n之前。在第一个有'r,然后没有'r,但'n匹配,所以一切都很好。

在第二个中,你得到的第一个字符是'n,然后没有'n匹配,所以它失败了。

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