【问题标题】:What should the javascript match() regex function return? [duplicate]javascript match() 正则表达式函数应该返回什么? [复制]
【发布时间】:2017-02-25 12:43:39
【问题描述】:

举个例子:

"12345".match(/(?=(\d{4}))/g);

将上面的那一行粘贴到我的 (Chrome) 控制台中将为我返回 ["", ""],但我正在尝试提取 ["1234", "2345"] 的数组。 This MDN article 似乎表明我确实应该期待一个匹配数组。

这个确切字符串上的特定正则表达式肯定会返回昨天在this question 中证明的那些匹配项。

如果我对此功能做出错误假设和/或滥用它,任何人都可以澄清预期的行为应该是什么以及我可以采取的任何替代方法。

【问题讨论】:

  • (1) 您不能在多个匹配项中匹配源字符串中的同一个字符,这显然是您想要的,因为“234”在两个所需的匹配项中。 (2) 前瞻不会捕获它正在查看的字符,这就是你得到空字符串的原因。
  • 您不能只是从答案中窃取正则表达式,而忽略使用正则表达式的代码。 Chrome 会为您的代码生成预期的输出。如果您使用链接的答案中提供的代码,您将获得所需的结果。
  • @Rawing - 正如我在评论中所说的那样,代码导致了我的无限循环。我将在今天晚些时候重温它,但 match() 更吸引我,因为它看起来更短/更具可读性。
  • 请说明your字符串的期望。

标签: javascript regex match


【解决方案1】:

您引用了问题Match all consecutive numbers of length n。为什么不从那里接受的答案中获取代码(https://stackoverflow.com/a/42443329/4875869)?

"12345".match(/(?=(\d{4}))/g); 的问题在于 ["", ""] 中的第一个 "" 对应于与 $0 (the whole match) = "", $1 (group 1) = "1234" 的匹配,因此第二个 "" (数组类似于 [$0 (match 1), $0 (match 2)] 因为 @987654329 @)。

如果您省略 g ("12345".match(/(?=(\d{4}))/);),您将得到 ["", "1234"] ([$0 (the match), $1 (the match)])。

【讨论】:

    【解决方案2】:

    编辑:正如上面trincot 所解释的那样,正则表达式似乎不是适合这项工作的工具。

    为了自我救赎,这里有一个有趣的解决方案,涉及数组和slice。文字 4 可以替换为任何其他数字以达到类似的效果。

    console.log(
      '12345'.split('').map((_, i, a) => a.slice(i, i + 4).join('')).slice(0, 1 - 4)
    )

    【讨论】:

    • 这只会产生一个匹配而不是两个。
    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多