正则表达式:加号操作符不匹配.我的正则表达式回溯了多少次?[^]*



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。

相关内容

  • 没有找到相关文章

最新更新