2017-02-25 46 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)])。

相關問題