正則表達式 /[1-9]d*$/ 導致 -1 返回 true 的原因分析
本文分析了為什么正則表達式 /[1-9]d*$/ 會錯誤地將 -1 判斷為 true。
代碼片段中的 isPositiveInteger 函數旨在檢查輸入字符串是否為正整數,它使用了正則表達式 /[1-9]d*$/ 進行匹配。
function isPositiveInteger(str) { const regex = /[1-9]d*$/; return regex.test(str); } console.log(isPositiveInteger("-1")); // 輸出 true (錯誤) console.log(isPositiveInteger("1")); // 輸出 true (正確)
-1 返回 true 的原因在于正則表達式 /[1-9]d*$/ 只匹配字符串的結尾部分($ 表示字符串結尾)。 [1-9] 匹配 1 到 9 之間的任意數字,d* 匹配零個或多個數字。 因此,正則表達式在 -1 的結尾找到了 “1”,符合模式,所以返回 true。 它忽略了字符串開頭的負號。
為了修正這個問題,使函數能夠正確識別正整數,需要修改正則表達式以匹配整個字符串,而非僅匹配結尾。 解決方案是在正則表達式開頭添加 ^ 符號,表示字符串的起始位置。 修改后的正則表達式 ^[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 (正確)
這個例子說明了,在使用正則表達式時,精確理解其匹配模式,特別是 ^ (開頭) 和 $ (結尾) 錨點符號,對于避免錯誤至關重要。 忽略這些錨點可能會導致正則表達式匹配到字符串的子串,而非整個字符串,從而產生不正確的結果。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END