Javascript + Regex = Nothing to repeat error?

正则表达式是前端开发中不可或缺的重要工具之一。而在处理字符串时,经常会用到量词符号来指定模式匹配次数,比如 * 表示零个或多个、+ 表示一个或多个、? 表示零个或一个。然而,在使用这些量词符号时,我们有可能会遇到一个错误:Nothing to repeat。本文将介绍这个错误的原因和解决方法,并提供实际场景下的示例代码。

错误原因

当我们在正则表达式中使用像 *+ 或者 {} 这样的量词符号时,需要注意它们所应用的模式是否存在,如果不存在,就会出现 Nothing to repeat 的错误。例如,以下正则表达式就会引发这个错误:

------

这个正则表达式的意思是匹配连续的数字 1 后面跟着零个以上的数字 0。由于 {} 中没有给出具体的数量,因此这个表达式会尝试去匹配一个空的模式,从而引发上述的错误。

解决方法

为了避免 Nothing to repeat 错误,我们需要确保所使用的量词符号右侧一定有可以重复的模式。以下是几种可能的解决方法:

1. 显式指定数量

我们可以通过显式指定重复次数来避免错误。例如,将上述例子中的 {} 改为 {0,} 就能够正确匹配:

--------

这个正则表达式的意思是匹配连续的数字 1 后面跟着零个或多个数字 0

2. 移除量词符号

如果我们只需要匹配一个或零个模式,可以使用其他的量词符号,比如 ? 或者 {0,1}。例如,以下两个正则表达式都可以正确匹配一个数字 1

----
--------

3. 确保模式存在

最后,我们也可以简单地确保所应用的模式存在,从而避免错误。例如,以下正则表达式就不会引发 Nothing to repeat 错误:

-----

这个正则表达式的意思是匹配连续的数字 1 后面跟着一个或多个数字 0

示例代码

以下是一个实际场景下遇到 Nothing to repeat 错误的示例代码。假设我们需要从一个字符串中提取出所有的带有千分位分隔符的数字。例如,对于以下字符串:

----- --- - ---- ----- -- --- ------- -- --------- --- --- -------- -- ------

我们希望匹配出 1,234.56 这个数字。我们可以使用以下正则表达式:

---------------------------

这个正则表达式的意思是匹配一个 $ 符号后面跟着 1 至 3 位数字、零个或多个以逗号分隔的连续 3 位数字、一个小数点和两位数字。然而,由于最后一个量词符号 * 右侧是一个空模式,因此会引发 Nothing to repeat 错误。为了解决这个问题,我们只需要将 * 改为 {0,} 就能够正确匹配:

---------------

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------