我正在尝试学习 JavaScript 中的正则表达式
。在进行测试时,我对输出感到困惑。
您能否解释一下为什么我的输出结果数组在模式中使用 *
而不是在 +
中时有空字符串。
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"]
最佳答案
*
,或 Kleene Star ,在正则表达式中表示“零个或多个”,因此它匹配空字符串。
+
表示“一个或多个”,因此它不匹配空字符串。
鉴于我们有如下
a = 'bb bbbb bbb';
让我们这样表示:
a = /^bb bbbb bbb$/;
其中 ^
是字符串的开头,$
是字符串的结尾。
我们的模式是(bb)*
。这意味着引擎将“零次或多次”查找两个 b
的序列。这意味着如果找到序列,则模式匹配 bb
,否则为空字符串。
现在我将逐步使用点 (.
) 来表示正则表达式分析。
步骤
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
,因为模式匹配了两个序列。
第 4 步
-> 第 2 步
第 5 步
-> 第 1 步
在STEP 6
中,我们推送了""
,因为模式匹配空字符串,因为只有一个b
被发现了。
最后你遇到了 $
标记,它再次匹配空字符串。
请注意,如果字符串为 "bb bbbb bbbb"
,则数组将为 ["bb", "", "bbbb", "", "bbbb", ""]
关于javascript - 为什么在 javascript 中使用正则表达式模式匹配字符串时,在输出数组中添加空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674291/