正则表达式的区别:(\w+)? 和 (\w*)

30
在正则表达式中,(\w+)?(\w*)有什么区别吗?它们看起来是一样的,不是吗?

它看起来一样,除非你关心""null的区别。 - John Dvorak
3
“(\w+)?” 看起来很奇怪。你在哪里看到的?能提供外部资源的链接吗? - Rohit Jain
我在公司的项目中看到了 (\w+)? - 爱国者
1个回答

34

(\w+)?(\w*) 都匹配相同的(0..+inf个单词字符)。

然而,它们之间有微小的差异:

在第一种情况下,如果这部分正则表达式匹配了 "",捕获组将不存在。而在第二种情况下,它是空的。在某些语言中,前者会表现为 null,而后者始终应该是 ""

例如,在Javascript中,

/(\w*)/.exec("")  // ["", ""]
/(\w+)?/.exec("") // ["", undefined]

在 PHP (preg_match) 中,如果没有匹配到对应的键,则在 matches 数组中该键将不存在:http://3v4l.org/DB6p3#v430


在哪种语言中,捕获 "" 会导致结果为 null 或空字符串? - Cozzamara
在第一个情况中,空匹配是 不会 被捕获的。 - John Dvorak
1
使用哪个引擎?Perl和SED都可以通过这两种模式捕获空字符串。 - Cozzamara
1
谢谢,我从未意识到非匹配组会导致undefined而不是空字符串(因为我总是只检查真实性)。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接