为什么在javascript中使用正则表达式匹配字符串时在输出数组中添加空字符串?

时间:2013-02-03 15:53:38

标签: javascript regex

我正在尝试在javascript中学习regex。在进行测试时,我的思绪在看到输出时感到困惑。

在模式中使用*而不是+时,请解释为什么输出结果数组的空字符串为空。

PS:所采用的输入只是一个简单的示例字符串。

这是我的示例代码:

a='bb bbbb bbb'
a.match(/(bb)*/g) // O/P is  ["bb","","bbbb","","bb","",""]
a.match(/(bb)+/g) // O/P is ["bb","bbbb","bb"] 

2 个答案:

答案 0 :(得分:3)

正则表达式中的*Kleene Star表示“零或更多”,因此它匹配空字符串

+的意思是“一个或多个”,因此它与空字符串不匹配。


鉴于我们有如下

a = 'bb bbbb bbb';

让我们这样表示:

a = /^bb bbbb bbb$/;

其中^是字符串的开头,$是字符串的结尾。

我们的模式是(bb)*。这意味着引擎将查找两个b“零次或多次”的序列。这意味着如果找到序列,模式匹配bb,否则匹配空字符串

现在我将逐步使用点(.)来表示正则表达式分析。

<强> STEPS

        STRING              MATCH ARRAY
start - /^.bb bbbb bbb$/ -> [ ]
    1 - /^bb. bbbb bbb$/ -> [ "bb" ]
    2 - /^bb .bbbb bbb$/ -> [ "bb", "" ]
    3 - /^bb bbbb. bbb$/ -> [ "bb", "", "bbbb" ]
    4 - /^bb bbbb .bbb$/ -> [ "bb", "", "bbbb", "", ]
    5 - /^bb bbbb bb.b$/ -> [ "bb", "", "bbbb", "", "bb" ]
    6 - /^bb bbbb bbb.$/ -> [ "bb", "", "bbbb", "", "bb", "", ]
    7 - /^bb bbbb bbb$./ -> [ "bb", "", "bbbb", "", "bb", "", "" ]

STEP 1中,我们推送了bb,因为模式匹配了一个序列。

STEP 2我们已推送"",因为模式匹配空字符串

STEP 3我们推送了bbbb因为模式匹配了两个序列。

STEP 4 - &gt; STEP 2

STEP 5 - &gt; STEP 1

STEP 6我们已推送""因为模式与空字符串匹配,因为只找到一个b

最后,您遇到$令牌,并再次匹配空字符串

请注意,如果字符串为"bb bbbb bbbb",则数组应为["bb", "", "bbbb", "", "bbbb", ""]

答案 1 :(得分:2)

*表示“将前一组匹配为零次或更多次”。引擎尝试在字符串中的第一个bb之后直接匹配位置。它找到一个空格,这意味着(bb)匹配“零次”,导致空匹配。

+表示“至少匹配前一组一次”,因此每个匹配都必须包含您案例中的字符序列bb


解释为什么最后有两个空匹配:

最后一个“字”是bbb。引擎匹配bb,这里没问题。然后剩下一个b。它匹配(bb)“零次”。然后它尝试匹配字符串的最后一个位置,该位置在字符串的最后一个字符和结尾之间。它再次匹配es (bb)“零次”。

如果您想了解正则表达式引擎的详细信息,我建议使用本书"Mastering Regular Expressions"