2013-02-19 79 views
1

就在你认为你已经掌握了正则表达式时;这一切都取消了。希望如果发现除字母数字和空白字符之外的任何内容,则返回错误检查。带空白的正则表达式的字母数字

function checkName(fname) 
{ 
    var rexp = new RegExp(/[^a-zA-Z0-9]\s/gim) 
    if (!rexp.test(fname)) 
    { 
     alert ("'" + fname + "'\nis okay") 
    } 
    else 
    { 
     alert ("'" + fname + "'\nis NOT okay") 
    } 
    return !rexp.test(fname) 
} 

我希望上面的代码将返回以下

  • “这是确定” - 真正的
  • “这,是不是OK” -false
  • “也不是这好!“ -false
  • “也不是\” 这行” - 假
+0

请使用* RegExp构造函数*或* regex文字,但不能同时使用*。 – Bergi 2013-02-19 13:13:51

回答

2

虽然许多讨论的是对的,一切似乎缺少您反转字符类的点,然后反转导致你的功能。这在逻辑上难以阅读。你也可以对正则表达式进行两次测试,没有任何理由。干净多了会是这样的:

function checkName(fname) { 
    var result = /^[a-z0-9\s]+$/i.test(fname) 

    if (result) { 
     alert ("'" + fname + "'\nis okay") 
    } else { 
     alert ("'" + fname + "'\nis NOT okay") 
    } 
    return result; 
} 

更新:它看起来像杰克的编辑拍摄过这些问题。 (总是晚一分钟,镍短...)

1

有几件事情:

  1. /something/new RegExp('something')短的符号;你不应该混淆了

  2. 您需要将\s移动到字符类中;否则,您将匹配不是字母数字的字符后跟一个空格。

  3. 我不认为你需要所有这些修饰语:

    1. /m,如果你在你的表达锚是唯一有用的,
    2. /i可以,如果你从字符类中删除A-Za-z使用,
    3. /g仅适用于需要多次匹配的情况,但在您的情况下,第一次匹配就足够了。

      var rexp = /[^a-zA-Z0-9\s]/; 
      

全功能可以这样写:

function checkName(fname) 
{ 
    return !/[^a-zA-Z0-9\s]/.test(fname); 
} 

而不是使用双重否定的,倒不如说 “只允许这些字符”:

function checkName(fname) 
{ 
    return /^[a-zA-Z0-9\s]*$/.test(fname); 
} 

如果您还需要测试非空名称,那么您应该使用/^[a-zA-Z0-9\s]+$/

+0

@downvoter认真吗?这个答案有什么问题? – 2013-02-19 13:24:43

+1

我不是downvoter,但我经过这些编辑后更喜欢这个答案! – 2013-02-19 13:40:56

1
[^a-zA-Z0-9]\s 

您的正则表达式要求空格在字母/数字后面。

要修复它,请将括号内的\s移开。

虽然你仍然需要做更多的事情。正则表达式只会匹配这些字符中的一个。添加+以匹配一个或多个。

因此,固定的正则表达式:

[^a-zA-Z0-9\s]+ 
+0

该表达意思相反,即如果“错误”集合中至少有一个字符,则拒绝该值。不知道你的答案会做什么,但我认为它是不正确的:) – 2013-02-19 13:23:55

+0

@Jack OP说“除了字母数字和空白字符” – Doorknob 2013-02-19 13:24:58

+0

是的,“以外”意味着没有字符不是字母数字:)我同意双重否定不是很好,但即使如此,你的表达也应该被固定......这样做会使它与Will.i.am的答案一样:) – 2013-02-19 13:27:07

0

尝试:

function checkName(fname) 
{ 
    var rexp = new RegExp(/^[a-z0-9\s]+$/i) 
    if (!rexp.test(fname)) 
    { 
     alert ("'" + fname + "'\nis okay") 
    } 
    else 
    { 
     alert ("'" + fname + "'\nis NOT okay") 
    } 
    return !rexp.test(fname) 
} 
+0

你可能应该解释说,你逆转了表达,然后锚定它;在这种情况下,你需要反转'if'条件。 – 2013-02-19 13:18:43