regex.test返回意外结果

时间:2017-08-04 05:26:53

标签: javascript regex

我有正则表达式问题,我已将其缩减为此代码:

const ENV_NAME_REGEX = '[a-zA-Z_]+[a-zA-Z0-9_]*'
const array = ["VALID", "9INVALID"]
array.forEach((item) => {
  const valid = new RegExp(ENV_NAME_REGEX).test(item)
  console.log(valid)
})

实际输出:

  

true,true

预期产出:

  

true,false

数组中的第二项与正则表达式匹配(因为第一个字符不能是数字)。那么为什么它输出都是真的呢?

3 个答案:

答案 0 :(得分:1)

您需要锚点:^位于开头,$位于结尾处。否则,你的正则表达式匹配字符串 middle 中的文本。



const ENV_NAME_REGEX = '^[a-zA-Z_]+[a-zA-Z0-9_]*$'
// ---------------------^-----------------------^
const array = ["VALID", "9INVALID"]
array.forEach((item) => {
  const valid = new RegExp(ENV_NAME_REGEX).test(item)
  console.log(valid)
})




旁注:除非有正确的理由去做其他事情,否则请使用正则表达式文字表示法,而不是字符串表示法和构造函数,因此您不必进行双重转义;并重用实例:



const ENV_NAME_REGEX = /^[a-zA-Z_]+[a-zA-Z0-9_]*$/
const array = ["VALID", "9INVALID"]
array.forEach((item) => {
  const valid = ENV_NAME_REGEX.test(item)
  console.log(valid)
})




(我们知道重复使用该实例是安全的,因为没有g标志。当有g标志时,如果您处理它是安全的小心翼翼。)

答案 1 :(得分:1)

对于RegExp.prototype.test(),部分匹配就足够了。

来自MDN文档:

  

只要您想知道是否在a中找到某个模式,请使用test()   string [...]

答案 2 :(得分:1)

使用锚点^和$否则它将为部分匹配赋予真实