我正在编写数据库备份功能,作为我学校项目的一部分。
我需要编写一个正则表达式规则,因此数据库备份名称只能包含合法字符。
'legal'是指不包含任何符号或空格的字符串。只有字母和数字的字母。
有效字符串的示例为'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 :(我的代码是错误的?还是我没有正确使用正则表达式规则?
答案 0 :(得分:2)
当您将正则表达式声明为RegExp构造函数的字符串参数时,您需要将其转义。两者
var regexRule = new RegExp("^[\\w]+$");
...和...
var regexRule = new RegExp(/^[\w]+$/);
会奏效。
请记住,数据库数据的客户端验证永远不够,因为通过在浏览器中禁用javascript可以轻松绕过验证,并且无效/恶意数据可以到达您的数据库。您需要在服务器端验证数据,但是使用无效数据阻止请求,但验证客户端是一种很好的做法。
答案 1 :(得分:2)
\w
是[[:alnum:]]的同义词,它与alnum类的单个字符匹配。请注意,使用字符类意味着您可以匹配不属于ASCII字符编码的字符,这些字符可能是您想要的,也可能不是。如果您真正想要匹配的是[0-9A-Za-z]
,那么您应该使用它。
答案 2 :(得分:2)
它可以更简单。这有效:
function checkValid(name) {
return /^\w+$/.test(name);
}
/^\w+$/
是new RegExp()
的字面符号。由于.test
函数返回一个布尔值,因此您只需返回其结果。这也比new RegExp("^\\w+$")
读得更好,并且你不太可能搞砸(感谢@ x3ro指出字符串中需要两个反斜杠)。
答案 3 :(得分:2)
这里的问题是,在字符串中编写\w
时,您将转义w
,生成的正则表达式如下所示:^[w]+$
,其中包含w
作为文字字符。在创建带有传递给RegExp
构造函数的字符串参数的正则表达式时,您需要转义反斜杠,如下所示:new RegExp("^[\\w]+$")
,这将创建所需的正则表达式。
有一种方法可以避免这种情况,使用JavaScript提供的简写符号:var regex = /^[\w]+$/;
,不需要任何额外的转义。
答案 4 :(得分:1)
这是官方规范:http://dev.mysql.com/doc/refman/5.0/en/identifiers.html但它不是很容易转换为正则表达式。只是正则表达式不会这样做,因为还有reserved words。
为什么不把它放在查询中(不要忘记正确地逃避它)并让MySQL给你一个错误?例如,您正在使用的MySQL版本中可能存在错误,即使您的检查正确,MySQL仍可能拒绝。