【问题标题】:Non-capturing groups in Javascript regexJavascript 正则表达式中的非捕获组
【发布时间】:2014-02-22 19:49:15
【问题描述】:

我将 Javascript 中的字符串与以下正则表达式匹配:

(?:new\s)(.*)(?:[:])

我使用函数的字符串是“new Tag:var;” 它应该返回的只是“标签”,而是返回一个包含“新标签:”和所需结果的数组。

我发现我可能需要使用lookbehind,但由于Javascript不支持它,我有点迷茫。

提前谢谢你!

【问题讨论】:

    标签: javascript regex regex-lookarounds regex-group


    【解决方案1】:

    好吧,我真的不明白为什么要为要提取的内容制作如此复杂的正则表达式:

    (?:new\\s)(.*)(?:[:])
    

    而它可以使用以下方法解决:

    s = "new Tag:";
    var out = s.replace(/new\s([^:]*):.*;/, "$1")
    

    您只有一个捕获组,即您正在寻找的那个。

    【讨论】:

    • 正如@anubhava 所说,.* 是“贪婪的”,不是一个好主意,因为如果您的字符串中有两列或更多列,它可能只匹配最后一列。
    • 那个过于贪婪的运营商快把我逼疯了。
    【解决方案2】:
    • \\s(双重转义)仅用于创建 RegExp 实例。
    • 另外,您的正则表达式在 .* 中使用了贪婪模式,这可能比预期的要匹配。

    让它不贪婪:

    (?:new\s)(.*?)(?:[:])
    

    或者更好地使用否定:

    (?:new\s)([^:]*)(?:[:])
    

    【讨论】:

    • 我的错,额外的 '\' 是为了逃避。否则,string.match() 仍然返回一个包含两个条目的数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2019-01-12
    相关资源
    最近更新 更多