JS Regex test()始终返回true

时间:2018-10-06 05:56:42

标签: javascript regex

我使用RegExr构建了此表达式,并且在测试时可以在其中正常运行。应该匹配不是字母,数字或-的任何内容。

/[^0-9a-zA-Z-]*/g

所以我想用它来测试javascript中的字符串。如果发现不是字母,数字或-的内容,则应返回true,否则返回false。

我说的测试在这里,您可以看到正确的匹配项:https://regexr.com/40ot1

.test()

  

test()方法执行搜索以查找常规规则之间的匹配项   表达式和指定的字符串。返回true或false。

const expression = /[^0-9a-zA-Z_]*/g;
const str1 = 'abc778defg'; //Expected false
const str2 = 'ab779cde fgh&$-'; //Expected true
const str3 = '123vFFFdd-'; //Expected false

console.log(expression.test(str1)); //output true?
console.log(expression.test(str2)); //output true
console.log(expression.test(str3)); //output true?

我如何按预期进行这项工作?

编辑:这个问题不是重复的,因为我不是在问如何match a whole value,我已经使用RegExr发现了这一点。我问为什么我的查询在其他地方无法正常工作。

2 个答案:

答案 0 :(得分:1)

您正在用*重复字符集。这意味着正则表达式将尝试匹配零个或多个这些字符。但是所有字符串都可能与字符匹配(零宽度匹配),例如,在字符串的开头。

删除中继器,以便仅测试字符串中任何位置的那些字符之一。另外,如果要测试破折号而不是下划线,请使用/[^0-9a-zA-Z_]/(将/[^0-9a-zA-Z-]/更改为_)而不是-,它简化为{{ 1}}-/[^\da-z-]/i是数字字符,因此最好使用0-9,当可以使用\d标志代替时,最好不要重复a-zA-Z

此外,在使用i时,不需要test全局标志:

/g

答案 1 :(得分:0)

您将const expression = /[^\da-z-]/i; const str1 = 'abc778defg'; //Expected false const str2 = 'ab779cde fgh&$-'; //Expected true const str3 = '123vfdd-'; //Expected false console.log(expression.test(str1)); console.log(expression.test(str2)); console.log(expression.test(str3));(否定)与*(最少)一起使用

您可以提出一个问题:是否存在至少0个看起来不像^的字符,答案是肯定的