為什么正則表達(dá)式 /[1-9]d*$/ 會(huì)錯(cuò)誤地將 -1 判定為正整數(shù)?

為什么正則表達(dá)式 /[1-9]d*$/ 會(huì)錯(cuò)誤地將 -1 判定為正整數(shù)?

正則表達(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ù)的正確方法。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享