提问人:Andrew G. Johnson 提问时间:8/21/2008 最后编辑:kapantzakAndrew G. Johnson 更新时间:5/2/2018 访问量:684
我在这里做错了什么?[Javascript 正则表达式]
What did I do wrong here? [Javascript Regex]
问:
所以我正在写一个注册表,我需要显示名称只有数字、字母和下划线。
看看我的代码,告诉我我做错了什么。
<form method="post" action="/" onsubmit="return check_form()">
<input type="text" id="display-name" name="display-name" maxlength="255" />
<input type="submit" />
</form>
<script type="text/javascript">
<!--
var name_regex = /^([a-zA-Z0-9_])+/
function check_form()
{
if (!name_regex.test(document.forms[0].elements[0].value))
{
document.forms[0].elements[0].focus()
alert("Your display name may only contain letters, numbers and underscores")
return false
}
}
-->
</script>
它显然已被削减为不包含与问题无关的任何内容,但即使是这个片段也不起作用。
答:
我的正则表达式如下:/^[a-zA-Z0-9_]+$/
编辑:我认为是缺少行尾导致它失败。$
我认为“不工作”是指它允许无效条目通过(而不是不让有效条目通过)。
正如 @Annan 所说,这可能是由于表达式末尾缺少字符,因为目前它只需要值开头的单个有效字符,其余的可以是任何内容。$
您的正则表达式
/^([a-zA-Z0-9_])+/
寻找
- string(check) 的开头,后跟
- 1 个或多个字母、数字或下划线(检查)
然后,无论之后发生什么都无关紧要。只要这个正则表达式以字母、数字或下划线开头,它就会匹配任何内容
如果你把 a 放在末尾,那么它会起作用 - 匹配“字符串末尾”,所以它可以匹配的唯一方法是字符串的开头和结尾之间只有数字、字母和下划线。$
$
/^([a-zA-Z0-9_])+$/
其次,我建议使用 INSTEAD,因为如果您重新排列 HTML,它不会中断,并且更像是“普遍接受的执行标准”document.getElementById('display-name').value
document.forms
评论
/\w/.test("é")
“doesn't work” 是什么意思?它是否拒绝有效的显示名称?它是否接受无效的显示名称?哪些?
根据 @Annan,省略 会使正则表达式接受无效的显示名称,例如 .$
abc123!@#
如果代码拒绝有效的显示名称,可能是因为括号是按字面匹配的,而不是表示一个组(我不确定 JS 中的引用约定)。
我测试了你的脚本并干预了javascript。这似乎有效:
<form method="post" action="/" onsubmit="return check_form()">
<input type="text" id="display-name" name="display-name" maxlength="255" />
<input type="submit" />
</form>
<script type="text/javascript">
<!--
var name_regex = /^([a-zA-Z0-9_])+$/;
function check_form()
{
if (!name_regex.test(document.forms[0].elements[0].value))
{
document.forms[0].elements[0].focus();
alert("Your display name may only contain letters, numbers and underscores");
return false;
}
}
-->
</script>
对不起,伙计们,我应该更具体。每当我添加空格时,这些值仍然被接受。美元符号成功了!$
一种更简单的写法仍然是
var name_regex = /^([a-z0-9_])+$/i;
更简单:
var name_regex = /^\w+$/;
评论