Regex:加号运算符不匹配。我的正则表达式回溯了多少次?[ ^ ]*
function stripComments(code) { return code.replace(///.*|/*[^]**//g, ""); }
console.log(stripComments("1 /* a */+/* b */ 1")); // → 1 1
// + operator is missing on the output`
解决方案1:惰性量词
//.*|/*[^]*?*/
其中*?
是一个惰性量词(它消耗尽可能少的字符)。
下面是它在第一个匹配组上的工作方式:
1 /* a */+/* b */ 1
^ it matches the first slash
^^ it matches the first asterisk
^^^ it fails to match the second asterisk and backtracks
^^^ it matches the space
^^^^ it fails to match the second asterisk and backtracks
^^^^ it matches 'a'
^^^^^ it fails to match the second asterisk and backtracks
^^^^^ it matches the space
^^^^^^ it succedes to match the second asterisk
^^^^^^^ it matches the second slash
查看这里的演示。
解决方案2:具有负字符类的贪心量词
//.*|/*[^*]**/
其中[^*]
是除星号以外的所有字符匹配的负字符类。
下面是它在第一个匹配组上的工作方式:
1 /* a */+/* b */ 1
^ it matches the first slash
^^ it matches the first asterisk
^^^ it matches the space since it’s not an asterisk
^^^^ it matches 'a' since it’s not an asterisk
^^^^^ it matches the space since it’s not an asterisk
^^^^^^ it fails to match something that is not an asterisk and backtracks
^^^^^^ it matches the second asterisk
^^^^^^^ it matches the second slash
查看这里的演示。
这个解决方案更有效,但是如果中间有星号就不起作用了。
方案3:具有负字符类和交替的贪心量词
假设你在中间有一个星号,例如:
1 /* a*c */+/* b */ 1
在这种情况下,您可以使用以下正则表达式:
//.*|/*(?:[^*]|*(?!/))**/
关键部分匹配非星号或星号后不跟斜杠的任何字符。
查看这里的演示。
下面是它在第一个匹配组上的工作方式:
1 /* a*c */+/* b */ 1
^ it matches the first slash
^^ it matches the first asterisk
^^^ it matches the space since it’s not an asterisk
^^^^ it matches 'a' since it’s not an asterisk
^^^^^ it fails to match something that is not an asterisk and backtracks
^^^^^ it matches the second asterisk
^^^^^^ it succeeds to match something that is not a slash
^^^^^^ it matches 'c' since it’s not an asterisk
^^^^^^^ it matches the third asterisk
^^^^^^^^ it matches the second slash
选择哪种解决方案取决于您的具体情况:
- 如果中间可能有许多星号,请使用解决方案1。
- 如果中间不能有星号,请使用解决方案2。
- 如果中间没有那么多星号,可以使用解决方案3。