我正在尝试在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"]
答案 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"。