2009-10-20 50 views
0

当我在此site处测试我的javascript时,它的行为与我所期望的相同。Javascript RegExp始终失败

然而,当我尝试和测试它在我的网页上它总是失败的测试

function testName() { 
    if (new RegExp('^(?!^(\..+)?$)[^\x00-\x1f\\?*:^&!`[email protected]#$$+=<>\?\*;|/]+$').test("me")) { 
     alert("good"); 
    } 
    else { 
     alert("invalid characters"); 
    } return false;   
} 

的表达应该是为特殊字符,如^&*!~ + = <>`等 上午我测试的文件名错过了一些愚蠢的东西?

+0

请复制在公共网站或HTTP的问题://代码似乎是正确的。我猜这是另一回事,在这个代码之外,这导致了一个问题。 – brianpeiris 2009-10-20 17:45:04

回答

0

一旦我关闭浏览器并清除了缓存,我的原始表达式就结束了工作,这很好,因为像沃伦年轻时所说的替代表达式很难看。

if(/^[\w-.()\']+$/.test(this.form.mediaFile.value)) return true; 
else return false; 
1

不想要解析的巨大丑陋的RE,我能看到的两个问题之一:

  1. 您的测试是倒退。在上面的例子中,test()调用将返回false,这意味着它不匹配“我”中的任何不良字符,因此您会收到一条警告,指出“无效字符”,这是向后的。

  2. 您的语法测试错误。尝试使用正则表达式文字来代替:

    if (/^(?!^(\..+)?$)[^\x00-\x1f\\?*:^&!`[email protected]#$$+=<>\?\*;|/]+$/.test("me")) { 
    
+0

对不起,我应该更具体地说明我在这一点上做了什么。 我原本有正则表达式,但把它移到了RegExp,所以我可以确定它不是一个无效的表达式。考虑到这个表达式,我还认为你可能会在返回虚假部分的测试中倒退。 – 2009-10-20 17:13:42

+0

是的,我的选择是或者或者不是两者。如果我愿意尝试弄清楚RE的含义,我可以告诉你哪一个,但正如我所说的,我不愿意。 :) – 2009-10-20 18:30:43

6

当你把你的正则表达式转换成字符串(当你使用像“新的正则表达式()”,而不是/.../符号),正则表达式字符串有改变。为什么?因为它现在将被解析两次而不是一次:首先,作为一个字符串 - 这意味着在字符串常量内发生的所有正常的反斜杠处理将发生,其次,作为正则表达式。

1
从逃避问题

除此之外,向前断言(您(?!组)只是broken in IE(而不是在原来的JavaScript规范)。他们不应该用在客户端JavaScript中。相反,将该条款中的测试分解成单独的条件。

(如果这是一个文件名测试人员,您不应该依赖于它的安全性,因为有许多破碎的结构并不赶。)