所以我有这个正则表达式:
(?:[ \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.
对此的任何帮助将不胜感激!
答案 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)
加倍反斜杠。
请注意这里:(?:*/)?
没有反斜杠?这意味着您的*
正试图重复......没有。没有什么可重复的。