JavaScript中正则表达式 *?与 ?或 *有什么区别吗?

*符号选定0个或一个或多个给定的表达,
?符号选定0个或一个,
*?这个应该是非贪心选择,跟单个?有什么区别吗?

const tags =  /^(area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i;
function convert(html) {
    return html.replace(
        /(<(\w+)[^>]*?)\/>/g, (all, front, tag) => {
            return tags.test(tag) ? all :
                front + "></" + tag + ">";
        });
}

这段函数用来关闭类似<table/>这种非自动关闭的元素,但是不是很理解作者在replace中使用*?而不是?。

阅读 2.2k
1 个回答

要理解 正则里的 贪婪匹配 和 非贪婪匹配

常规的 *+ 是贪婪匹配
后面加上 ? 就是是非贪婪匹配 *? +?

理解一下下面这个

'aaaaa'.match(/(a*?)(a*)/)
// 结果是
["aaaaa", "", "aaaaa"]

'aaaaa'.match(/(a*)(a*?)/)
// 结果是
[ "aaaaa", "aaaaa", "" ]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题