0

我想替换两个评论之间的内容,例如

/**** Useless CSS ****/
.my-class{
 margin: 12px;
}

/* Several Lines after including other comments **/

/**** END Useless CSS ****/

.other {
 padding: 12px;
}
/* Hello */

到目前为止,我有:

[\/* Useless CSS \*\/](.|[\r\n])*?END Useless CSS \*\*\*\*\/?

但这不起作用。我在 Regex101 中遇到错误:灾难性回溯

4

3 回答 3

2

您的问题的一部分是您的正则表达式的第一部分。您正在使用[\/* Useless CSS \*\/],一个字符类,这意味着该集合中的任何字符。换句话说,以下任何字符(删除重复字母后):/* UselCS. 这绝对不是你的意图,但这就是它正在做的事情。下面的代码从模式中删除了字符类,使其/**** Useless CSS ****/显式匹配。

第二个变化是(.|[\r\n])*?变成[\s\S]*?. 无需每次都针对两个选项进行正则表达式检查。如果是一组字符,只需将它们添加到同一个字符类中即可。[\s\S]是一种表示任何字符(包括换行符)的方式。另一种方法(适用于 JavaScript,但没有很多其他正则表达式引擎)是使用[^].

第三个变化是更改\*\*\*\*\*{4}。这不仅更短更容易理解,而且还提高了性能,因为正则表达式引擎不需要逐个标记\*,然后\*,然后\*等。它被告知匹配*四次,所以它一次性完成而不是4. 这意味着\*\*\*\*需要四个步骤,而\*{4}只需要一个。

您还可以附加\s*到末尾以删除额外的空格。

\/\*{4} Useless CSS \*{4}\/[\s\S]*?\/\*{4} END Useless CSS \*{4}\/

var s = `/**** Useless CSS ****/
.my-class{
 margin: 12px;
}

/* Several Lines after including other comments **/

/**** END Useless CSS ****/

.other {
 padding: 12px;
}
/* Hello */`
var r = /\/\*{4} Useless CSS \*{4}\/[\s\S]*?\/\*{4} END Useless CSS \*{4}\//gi

console.log(s.replace(r, ''))

于 2018-02-14T14:26:50.860 回答
2

仅仅因为您可以使用正则表达式并不意味着您必须使用正则表达式。

let css = `
.boat {
	float: left;
}

/**** Useless CSS ****/
.my-class{
 margin: 12px;
}

/* Several Lines after including other comments **/

/**** END Useless CSS ****/

.other {
 padding: 12px;
}
/* Hello */`;

const START_DELIMITER = '/**** Useless CSS ****/';
const END_DELIMITER = '/**** END Useless CSS ****/';

const left = css.slice(0, css.indexOf(START_DELIMITER));
const right = css.slice(css.indexOf(END_DELIMITER) + END_DELIMITER.length);

console.log(left + 'NEW STUFF' + right);

于 2018-02-14T14:42:49.460 回答
1

您的正则表达式几乎可以工作,但您应该考虑如下所示的一些更改:

(\/\*+ Useless CSS \*+\/)(.|[\r\n])*?END Useless CSS \*\*\*\*\/
^  ^ ^               ^  ^

说明:

  • 更改[...](...). 前者定义一个字符类,后者定义一个组。
  • 转义*以表达文字字符,否则该字符可用作正则表达式量词

  • 量化\*+匹配*序列中的字符。

现场演示

(.|[\r\n])应该匹配任何字符到一个点对于[\s\S]or [^](在 JS 中)来说是一个不好的选择。此外,我会\s*在模式末尾添加以匹配左空格:

\/\*+ Useless CSS \*+\/[^]*?END Useless CSS \*+\/\s*
                                                 ^^^

现场演示

于 2018-02-14T14:38:06.480 回答