正則表達(dá)式 /[1-9]d*$/ 匹配問(wèn)題的深入分析
在使用正則表達(dá)式驗(yàn)證輸入是否為正整數(shù)時(shí),表達(dá)式 /[1-9]d*$/ 存在一個(gè)缺陷:它會(huì)錯(cuò)誤地將 -1 判斷為正整數(shù)。本文將詳細(xì)解釋其原因,并提供正確的解決方案。
問(wèn)題源于代碼片段:
function isPositiveInteger(str) { const regex = /[1-9]d*$/; return regex.test(str); } console.log(isPositiveInteger("-1")); // 錯(cuò)誤地輸出 true console.log(isPositiveInteger("1")); // 正確輸出 true
/[1-9]d*$/ 的構(gòu)成:
- [1-9]:匹配一個(gè) 1 到 9 之間的數(shù)字。
- d*:匹配零個(gè)或多個(gè)數(shù)字 (0-9)。
- $:匹配字符串的結(jié)尾。
關(guān)鍵在于 $ 錨點(diǎn)。該正則表達(dá)式從字符串的末尾開(kāi)始匹配。對(duì)于 -1,正則表達(dá)式引擎會(huì)先找到 1 (滿(mǎn)足 [1-9] ),然后 d* 匹配零個(gè)數(shù)字,最后 $ 匹配字符串的結(jié)尾。因此,-1 滿(mǎn)足了該正則表達(dá)式的匹配條件,返回 true。
解決方案:
為了準(zhǔn)確驗(yàn)證正整數(shù),需要確保正則表達(dá)式匹配整個(gè)字符串,而不是僅僅匹配字符串的一部分。為此,需要在正則表達(dá)式的開(kāi)頭添加 ^ 錨點(diǎn),表示匹配字符串的起始位置。
正確的正則表達(dá)式應(yīng)該是:^[1-9]d*$
修改后的代碼:
function isPositiveInteger(str) { const regex = /^[1-9]d*$/; return regex.test(str); } console.log(isPositiveInteger("-1")); // 正確輸出 false console.log(isPositiveInteger("1")); // 正確輸出 true
^[1-9]d*$ 從字符串開(kāi)頭 (^) 開(kāi)始匹配一個(gè) 1 到 9 之間的數(shù)字 ([1-9]),后面跟著零個(gè)或多個(gè)數(shù)字 (d*),直到字符串結(jié)尾 ($)。 這樣,-1 由于不符合從頭到尾的匹配規(guī)則,將被正確地判斷為非正整數(shù)。 這才是驗(yàn)證正整數(shù)的正確方法。