.trim()和正则表达式产生意外结果

时间:2014-06-01 06:16:09

标签: javascript regex string

我编写了一个相当简单的正则表达式来检测字符串何时可能是一封电子邮件:

var looksLikeEmail = /^\S+@\S+\.\S+$/gi;

我正在使用Knockout,正在测试的字符串是textarea的值。

基本上,假设我们在变量text中有textarea的值。例如,该值是键入值abc@example.com

奇怪的是,即使text === text.trim()looksLikeEmail.test(text)返回true,但looksLikeEmail.test(text.trim())返回false。

另一方面,如果我手动创建字符串var test2 = 'abc@example.com',则不会出现此问题。

这似乎向我表明textarea正在插入一些奇怪的字符或某些东西...... .trim()正在做一些奇怪的事情。但是test.length === test2.lengthtest.length === test.trim().length

有谁知道如何使这种行为正确吗?

我写了jsfiddle来快速演示行为......

如果你去小提琴并尝试输入电子邮件......你会看到问题所在。另一个奇怪的行为:在电子邮件后添加一个空格,然后将其删除。 /混淆

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:2)

.test(),就像.exec()一样,在使用全局正则表达式时会记住匹配的最后一个索引,并尝试从它开始匹配,在第二次调用时失败。只需从正则表达式中删除/g选项 - 在与开头和结尾匹配的非多行正则表达式中使/g是没有意义的。