Nodejs regexp错误:“无效的正则表达式:无需重复”

时间:2014-12-11 11:43:31

标签: javascript regex node.js

所以我有这个正则表达式:

(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#exclude[ \t]*([^\n*]*)[ \t]*(?:\*\/)?(?:[ \t]*[\r\n]+)?((?:.|\n|\r)*?)(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#endexclude[ \t]*(?:\*\/)?(?:[ \t]*[\r\n]+)?

应该匹配任何看起来像这样的东西:

/* #exclude */
hurdur = somerandomtextorcode;
/* #endexclude */

我正在https://regex101.com/https://regex101.com/r/eA5oK9/1)这样的工具中尝试使用这个正则表达式,它只是工作,没有错误。

但是,在nodejs环境中,我得到了这个错误,我真的不知道如何解决:

Warning: Invalid regular expression: /(?:[      ]*)?(?://|/*)[  ]*#exclude[
]*([^
]*)[    ]*(?:*/)?(?:[   ]*[
]+)?((?:.|
|
)?)(?:[         ]*)?(?://|/*)[  ]*#endexclude[  ]*(?:*/)?(?:[   ]*[
]+)?/: Nothing to repeat Use --force to continue.

对此的任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

好吧,事实证明这是一个与我实际创建正则表达式的方式有关的问题。

我正在创建(并应用)正则表达式,如下所示:

var rExclude = '(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#exclude[ \t]*([^\n*]*)[ \t]*(?:\*\/)?(?:[ \t]*[\r\n]+)?((?:.|\n|\r)*?)(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#endexclude[ \t]*(?:\*\/)?(?:[ \t]*[\r\n]+)?';

contents = contents.replace(new RegExp(rExclude, 'gi'), function () { return ""; });

这给了我在起始帖子中描述的错误。 但是,由于正则表达式位于字符串中,因此JavaScript决定要以不同方式处理正则表达式。您可以通过两种方式解决它:

解决方案1 ​​ 此解决方案改变了字符串中转义内容的方式。

var rExclude = '(?:[ \t]*)?(?://|/\\*)[ \t]*#exclude[ \t]*(?:\\*/)?(?:.|\n|\r)*?(?://|/\\*)[ \t]*#endexclude[ \t]*(?:\\*/)?';

contents = contents.replace(new RegExp(rExclude, 'gi'), function () { return ""; });

解决方案2 此解决方案改变了创建实际正则表达式的方式:

contents = contents.replace(/(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#exclude[ \t]*(?:\*\/)?(?:.|\n|\r)*?(?:\/\/|\/\*)[ \t]*#endexclude[ \t]*(?:\*\/)?/gi, function () { return ""; });

不幸的是,这只是另一个怪异的JavaScript怪癖。

答案 1 :(得分:-1)

加倍反斜杠。

请注意这里:(?:*/)?没有反斜杠?这意味着您的*正试图重复......没有。没有什么可重复的。