【问题标题】:Regex validation rules正则表达式验证规则
【发布时间】:2012-01-31 20:31:01
【问题描述】:

我正在编写一个数据库备份功能,作为我学校项目的一部分。

我需要编写一个正则表达式规则,以便数据库备份名称只能包含合法字符。

“合法”是指不包含任何符号或空格的字符串。只有字母表和数字中的字母。

一个有效字符串的例子是'31Jan2012''63927jkdfjsdbjk623''hello123backup'

到目前为止,这是我的 JS 代码:

    // Check if the input box contains the charactes a-z, A-Z ,or 0-9 with a regular expression.

    function checkIfContainsNumbersOrCharacters(elem, errorMessage){
        var regexRule = new RegExp("^[\w]+$");
        if(regexRule.test( $(elem).val() ) ){ 
            return true;
        }else{
            alert(errorMessage);
            return false;
        }
    }


//call the function

checkIfContainsNumbersOrCharacters("#backup-name", "Input can only contain the characters a-z or 0-9.");

虽然我以前从未真正使用过正则表达式,但是在快速搜索后我找到了this 工具,我从中编写了以下正则表达式规则:

^[\w]+$

^ = 字符串开头

[/w] = a-z/A-Z/0-9

'+' = 字符串后面的字符。

在运行我的函数时,我输入的任何字符串似乎都返回 false :( 我的代码错了吗?还是我没有正确使用正则表达式规则?

【问题讨论】:

  • 我在我的 JS 控制台中尝试了/^[\w]+$/.test("ads123"),它可以正常工作,也就是说,它应该返回true
  • new Regexp("[regexp-goes-here]", "[modifiers]")/[regexp-goes-here]/[modifiers] 是等价的。请注意前者使用引号,后者不使用。
  • + 稍微更正确的解释是“匹配前一个标记(即\w)1 次或多次”。但据我所见,代码应该可以工作。
  • 您的所有回复都太好了,无法投票,所以我为你们所有人投票。非常感谢所有回答/评论这个问题的人,我学到了很多东西,现在问题已经解决了:)

标签: javascript regex validation


【解决方案1】:

这里的问题是,当在字符串中写入\w 时,您会转义w,生成的正则表达式如下所示:^[w]+$,其中包含w 作为文字字符。当使用传递给RegExp 构造函数的字符串参数创建正则表达式时,您需要转义反斜杠,如下所示:new RegExp("^[\\w]+$"),这将创建您想要的正则表达式。

有一种方法可以避免这种情况,使用 JavaScript 提供的速记符号:var regex = /^[\w]+$/;,不需要任何额外的转义。

【讨论】:

  • +1 为我错过了这一点,即使我在几个小时前的另一篇文章中解释了它。 ;-)
【解决方案2】:

它可以更简单。这有效:

function checkValid(name) {
  return /^\w+$/.test(name);
}

/^\w+$/new RegExp() 的文字符号。由于.test 函数返回一个布尔值,您只需要返回它的结果。这也比new RegExp("^\\w+$") 读起来更好,而且你不太可能搞砸(感谢@x3ro 指出字符串中需要两个反斜杠)。

【讨论】:

  • -1 说正则表达式很好,因为它有错误
【解决方案3】:

\w 是 [[:alnum:]] 的同义词,它匹配 alnum 类的单个字符。请注意,使用字符类意味着您可以匹配不属于 ASCII 字符编码的字符,这可能是您想要的,也可能不是。如果您真正打算匹配的是[0-9A-Za-z],那么您应该使用它。

【讨论】:

  • \w[\w] 在这种情况下是绝对等价的 - 不需要括号,但对结果没有影响。
  • 那是 JavaScript 的东西吗?在其他环境中,范围内的字符会失去其特殊性。还是[\w]被认为是一个字符类,相当于[:print:]
  • [\w] 在每种正则表达式方言中都执行相同的操作 - javascript、.NET、Python、Perl、Ruby、XPath 等。除了 \w 表示不同的东西,具体取决于方言是否支持 unicode .括号没有区别。
  • 我注意到 \w 不包含在 re_format(3) 中,并且似乎不是 POSIX 1003.2 正则表达式定义的一部分,尽管我从 grep(1) 手册页中看到\w 是 [[:alnum:]] 字符类的同义词。
  • 是的,你是对的。这两个例外是 GNU 和 POSIX 的基本正则表达式方言。两者的扩展方言都支持它。但是,BRE 方言也不支持“+”,并且也会按字面意思匹配。
【解决方案4】:

当您将正则表达式声明为 RegExp 构造函数的字符串参数时,您需要对其进行转义。两者都有

var regexRule = new RegExp("^[\\w]+$");

...和...

var regexRule = new RegExp(/^[\w]+$/);

会起作用的。

但请记住,对数据库数据进行客户端验证永远不够,因为通过在浏览器中禁用 javascript 可以轻松绕过验证,并且无效/恶意数据可能会到达您的数据库。您需要在服务器端验证数据,但防止带有无效数据的请求,但验证客户端是一种很好的做法。

【讨论】:

  • 谢谢,我编辑了答案。不过,您必须转义字符串才能使其正常工作。
  • 如果您使用文字,则不需要new RegExp/asdf/ 很好。
【解决方案5】:

这是官方规范:http://dev.mysql.com/doc/refman/5.0/en/identifiers.html,但它不是很容易转换为正则表达式。只是一个正则表达式不会这样做,因为还有reserved words

为什么不把它放在查询中(别忘了正确地转义它)让 MySQL 给你一个错误?例如,您使用的 MySQL 版本可能存在错误,即使您的检查正确,MySQL 仍可能拒绝。

【讨论】:

  • -1 将未经验证/清理的内容放入 MySQL 查询中对我来说似乎不是一个好主意。
  • 当然可以,只要确保正确转义即可。
  • 很公平。收回我的-1 并添加一个注意不要忘记正确逃生:)