JavaScript 正则表达式 .test() 的意外行为

标签 javascript regex

我正在 JavaScript 中创建一个正则表达式,它应该查找数字(至少 1)和字母(至少 1),总长度在 6 到 10 之间。我遇到了一些意想不到的行为。

我的正则表达式 - /^[a-z+\d+]{6,10}$/g

这不能正常工作,因为在字符类中,它会检查字母或数字,但不会同时检查两者。因此,我预计 "123456" 会失败,因为虽然它包含 6 个字符,并且至少有 1 个数字,但它不包含 1 个字母。

但是,在下面的代码片段中,当我将正则表达式存储在 rgx 变量中并对其使用 .test() 时,它以某种方式正确返回 false,如第二个 console.log 语句所示。但在下一行,当我直接将正则表达式与 .test() 使用时,它返回 true

let rgx = /^[a-z+\d+]{6,10}$/g;

// works fine
console.log(rgx.test("abcd12"));

// returns false
console.log(rgx.test("123456"));

// same regex returns true
console.log(/^[a-z+\d+]{6,10}$/g.test("123456"));

这是怎么回事?

最佳答案

尝试

let rgx = /^[a-z+\d+]{6,10}$/g;
let rgx2 = /^[a-z+\d+]{6,10}$/g;
console.log(rgx.test("abcd12")); //true
console.log(rgx2.test("123456")); //true

因为

Javascript RegExp object is stateful i.e. if you re-use a RegExp object (with 'g' flag set), subsequent matches would start from the end of the last match.

关于JavaScript 正则表达式 .test() 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47120206/

相关文章:

javascript - 可能的 CORS 问题。这是怎么回事?我该如何解决?

javascript - 使用 jQuery 修改类

c# - 如何在 C# 中使用正则表达式从字符串中删除所有不需要的字符?

Javascript正则表达式捕获下一个单词

java - 为什么 split 方法不支持 $,* 等分隔符来分割字符串

javascript - D3.v3 刷怪行为

javascript - 警告 : Uglification failed. 意外标记:eof(未定义)

javascript - 如何在 WebGL 中使用键盘更改对象颜色?

javascript - 下拉菜单值输出

python - django 中的 urls.py 正则表达式评估顺序是什么?