【问题标题】:Why is this javascript non-greedy regex matching nothing?为什么这个 javascript 非贪婪的正则表达式不匹配?
【发布时间】:2020-03-12 09:47:43
【问题描述】:

拥有下面的 url 和 js 正则表达式,我希望能捕捉到 f2fJsDFJ23,但非贪婪部分 .*?\?? 不能按预期工作

原因是什么?

let t = 'https://www.youtube.com/embed/f2fJsDFJ23?autoplay=1'
let reg = /(?:embed\/)(.*?)(?:\??)/.exec(t)
document.write(`6>>> ${reg && reg.join(' | ')} <br/>`)

reg = /(?:embed\/)(.*)(?:\??)/.exec(t)
document.write(`6>>> ${reg && reg.join(' | ')} <br/>`)

reg = /(?:embed\/)(.*)(?:\?)/.exec(t)
document.write(`6>>> ${reg && reg.join(' | ')} <br/>`)

t = 'https://www.youtube.com/embed/f2fJsDFJ23'
reg = /(?:embed\/)(.*?)(?:\??)/.exec(t)
document.write(`6>>> ${reg && reg.join(' | ')} <br/>`)

reg = /(?:embed\/)(.*)(?:\??)/.exec(t)
document.write(`6>>> ${reg && reg.join(' | ')} <br/>`)

reg = /(?:embed\/)(.*)(?:\?)/.exec(t)
document.write(`6>>> ${reg && reg.join(' | ')} <br/>`)

【问题讨论】:

  • 你的意思是这样吗? regex101.com/r/DgB5XU/1 ? 是可选的,并且在它之后没有任何内容供模式匹配,因此非贪婪将满足尽可能少的匹配。您可以改为匹配 ? 或断言字符串的结尾。
  • 好的,我认为 ? 也可能意味着 0 个匹配项,但事实并非如此,所以我可以使用 OR 运算符,非常棒:) 非常感谢! (如果您在答案中写下相同的答案,我将关闭此)

标签: javascript regex regex-greedy non-greedy


【解决方案1】:

在您的模式中,(.*?) 部分是非贪婪的,尽可能地放弃。之后它将匹配一个可选的问号。由于问号是可选的,点是非贪婪的,因此该模式仅匹配 embed/ 就足够了。

一种选择是匹配? 或使用alternation 断言字符串$ 的结尾。

请注意,您可以省略 embed 周围的非捕获组和问号。

embed\/(.*?)(?:\?|$)

Regex demo


另一种选择是使用与除? 或空白字符之外的任何字符匹配的否定字符类:

embed\/([^?\s]*)

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多