function isPositiveInteger(str) {
const regex = /[1-9]\d*$/;
return regex.test(str);
}
console.log(isPositiveInteger("-1")); // 输出 true, 应该输出 false
console.log(isPositiveInteger("1")); // 输出 true
为什么 -1 是 true
function isPositiveInteger(str) {
const regex = /[1-9]\d*$/;
return regex.test(str);
}
console.log(isPositiveInteger("-1")); // 输出 true, 应该输出 false
console.log(isPositiveInteger("1")); // 输出 true
为什么 -1 是 true
在 JavaScript 中,正则表达式 /[1-9]\d*$/
用于匹配一个字符串,该字符串以非零数字开头([1-9]
),后面跟着零个或多个数字(\d*
)。然而,这个正则表达式并不直接处理字符串的符号或前缀,它只关注字符串中符合 [1-9]\d*
模式的字符序列。
在你的例子中,当你调用 isPositiveInteger("-1")
时,这个正则表达式实际上并没有检查字符串的开头是否为负号(-
)。它仅仅从字符串的开头开始查找,尝试匹配 [1-9]
后的任何数字序列。由于字符串 "-1" 的第一个字符(-
)不符合 [1-9]
,正则表达式本应该不匹配整个字符串。然而,这里有一个关键点:正则表达式默认是从字符串的开头开始匹配的,如果没有找到匹配项,则整个匹配失败。
但问题出在正则表达式本身并没有包含检查字符串开头的逻辑(如使用 ^
符号来确保从字符串的开头开始匹配)。由于 -1
字符串中并不包含从 [1-9]
开头的数字序列(考虑到整个字符串),理论上应该返回 false
。然而,由于正则表达式的具体实现和行为可能因 JavaScript 引擎而异,实际上这里的问题可能源自于对函数 isPositiveInteger
的理解或实现上的误解。
对于你的特定情况,如果你想要确保字符串仅匹配正整数(不包含负号或前导零),你应该使用正则表达式 /^[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" 不是正整数,因为它以负号开头。
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
-1
中1
的这一部分是可以匹配的。匹配整串得在前面再加个
^
(匹配串首)