2017-02-25 95 views
-1

拿这个例子:JavaScript匹配()正则表达式函数应该返回什么?

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

粘贴以上行到我的(铬)控制台返回["", ""]但对我来说,我试图提取的["1234", "2345"]阵列。 This MDN article似乎表明,我确实应该期待一系列的比赛。

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

任何人都可以请澄清预期的行为应该是什么,以及我可以采取的任何替代方法,如果我对这个功能做了一个不正确的假设和/或滥用它。

+3

(1)您无法在多个匹配中匹配您的源字符串中的相同字符,这显然是您想要的,因为“234”在两个期望的匹配中。 (2)前瞻性不会捕获它正在展望的角色,所以这就是为什么你会得到空字符串。 – trincot

+0

你不能从答案中窃取正则表达式,而是忽略使用正则表达式的代码。 Chrome会为您的代码生成预期的输出。如果你使用你链接的答案中提供的代码,你会得到你想要的结果。 –

+0

@Rawing - 正如我在评论中所说的那样,代码导致了我的无限循环。我今天晚些时候会重新访问它,但'match()'更吸引我,因为它看起来更短/更易读。 – DaveHolt

回答

0

编辑:看起来正则表达式不是正确的工具,正如上面的trincot所解释的。

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

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

+3

这只会产生一个匹配而不是两个。 –

0

你提到的问题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)]由于g)。

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

相关问题