【问题标题】:Javascript [0] at the end of match statement匹配语句末尾的 Javascript [0]
【发布时间】:2012-03-14 18:30:50
【问题描述】:

我有以下几点:

    var1 = "www.asite.page.co.uk";
    var2 = '.' + var1.match(/\w*\.\w*$/) [0];

我知道它正在尝试实现“.co.uk”,但我不知道 [0] 的作用。 是错误处理吗?

【问题讨论】:

    标签: javascript regex match


    【解决方案1】:

    match 返回一个由 字符串 组成的 array

    没有全局标志,数组组成如下:

    • 仅使用第一个匹配项。
    • 第一个键 [0] 包含第一个完整匹配项
    • 其他键包含第一个匹配项中匹配的

    例子:

    var string = 'abc_123_abd_456';
    var regexp = /_([0-9])/; // Matches an underscore, and groups a number
    var match = string.match(regexp);
    // match[0] = _1 (full match)
    // match[1] = 1  (group)
    

    当指定全局标志时,数组包含所有完全匹配:

    var string = 'abc_123_abd_456';
    var regexp = /_([0-9])/g; // Matches an underscore, and groups a number, GLOBAL
    var match = string.match(regexp);
    // match[0] = _1 (first full match)
    // match[1] = _4 (second full match)
    

    我建议看看:

    【讨论】:

      【解决方案2】:

      match 方法返回一个匹配数组,因此 [0] 获取该数组的第一个元素——即完全匹配。

      有关更完整的说明,请参阅 matchRob W's answer 的文档。

      【讨论】:

      • 但是注意如果匹配失败则返回NULL,然后[0]会产生错误。我经常使用 (x.match(y)||["?"])[0] 形式的东西,它会返回 "?"如果匹配失败。
      【解决方案3】:

      请参阅 RobW 的答案以获得完整准确的参考。


      match 方法返回一个数组。

      match() 方法搜索正则表达式和字符串之间的匹配项,并返回匹配项。
      此方法返回匹配数组,如果未找到匹配则返回 null。

      [0] 用于仅返回第一个元素。

      【讨论】:

      • 好的,谢谢,这是有道理的,如果您不使用它,它会显示数组中的每个元素吗?
      • 如果你关闭它,var2 将是一个包含所有匹配项的数组
      • @DidierGhys 大错特错。当它被关闭时,只显示一个匹配项,因为未指定全局标志。
      • @RobW。事实上,我是从您的文档链接中读到的。我不是正则表达式专家,所以我想我刚刚在这里学到了一些东西。很抱歉可能有错误的信息!
      • 从您的书签中删除 w3schools,并改用 MDN。使用 mdn 为您的 Google 搜索添加前缀,您将始终获得可靠的信息 (reasons not to use wschools)。
      【解决方案4】:

      当您需要一个字符串时,使用replace 而不是match 通常更实用:

       var1 = "www.asite.page.co.uk";
       var2 = '.' + var1.replace(/.+?(\w*\.\w*)$/, '$1'); // .co.uk
      

      顺便说一句,我觉得你的表情不太对劲。匹配 TLD 的更好方法是

      (\.[a-z]+\.[a-z][a-z]|\.[a-z]{3,})$
      

      同时匹配“.co.uk”和“.com”。示例:

      tld = "site.co.uk".replace(/.+?(\.[a-z]+\.[a-z][a-z]|\.[a-z]{3,})$/, '$1'); // .co.uk
      tld = "yyy.com".replace(/.+?(\.[a-z]+\.[a-z][a-z]|\.[a-z]{3,})$/, '$1'); // .com
      

      【讨论】:

      • 我并不打算如此强调这一点 ;) 请注意:为了安全起见,.+? 应该是 [\S\s]*?。当 TLD 不包含前缀 (*?) 或字符串包含换行符 ([\S\s]) 时,仍然应该存在匹配项。在这种情况下,这些情况可能不太可能发生,但通常,[\S\s] 应优先于 .(点与换行符不匹配)。
      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 2012-12-16
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多