我在这里做错了什么?[Javascript 正则表达式]

What did I do wrong here? [Javascript Regex]

提问人:Andrew G. Johnson 提问时间:8/21/2008 最后编辑:kapantzakAndrew G. Johnson 更新时间:5/2/2018 访问量:684

问:

所以我正在写一个注册表,我需要显示名称只有数字、字母和下划线。

看看我的代码,告诉我我做错了什么。

<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>

它显然已被削减为不包含与问题无关的任何内容,但即使是这个片段也不起作用。

JavaScript 正则表达式

评论


答:

6赞 AnnanFay 8/21/2008 #1

我的正则表达式如下:/^[a-zA-Z0-9_]+$/

编辑:我认为是缺少行尾导致它失败。$

0赞 samjudson 8/21/2008 #2

我认为“不工作”是指它允许无效条目通过(而不是不让有效条目通过)。

正如 @Annan 所说,这可能是由于表达式末尾缺少字符,因为目前它只需要值开头的单个有效字符,其余的可以是任何内容。$

14赞 Orion Edwards 8/21/2008 #3

您的正则表达式

/^([a-zA-Z0-9_])+/

寻找

  1. string(check) 的开头,后跟
  2. 1 个或多个字母、数字或下划线(检查)

然后,无论之后发生什么都无关紧要。只要这个正则表达式以字母、数字或下划线开头,它就会匹配任何内容

如果你把 a 放在末尾,那么它会起作用 - 匹配“字符串末尾”,所以它可以匹配的唯一方法是字符串的开头和结尾之间只有数字、字母和下划线。$$

/^([a-zA-Z0-9_])+$/

其次,我建议使用 INSTEAD,因为如果您重新排列 HTML,它不会中断,并且更像是“普遍接受的执行标准”document.getElementById('display-name').valuedocument.forms

评论

2赞 Ruan Mendes 3/23/2010
\w 是字母、数字和下划线的简写。我会将其简化为 /^\w+$/
0赞 tobyodavies 12/10/2010
@Juan,在大多数语言中,什么算作单词字符取决于系统和语言环境,在 JS 中不是这样吗?
0赞 Ruan Mendes 12/11/2010
大多数正则表达式引用将 \w 列为 [a-zA-Z_0-9] 的快捷方式。爪哇的: download.oracle.com/javase/6/docs/api/java/util/regex/Pattern .PHP使用POSIX,它基本上说了同样的事情。也适用于 JS。 当我的区域设置设置为 pt-br 时返回 false。我从未听说过 \w 在检测其他语言环境方面非常聪明。/\w/.test("é")
0赞 Chris Conway 8/21/2008 #4

“doesn't work” 是什么意思?它是否拒绝有效的显示名称?它是否接受无效的显示名称?哪些?

根据 @Annan,省略 会使正则表达式接受无效的显示名称,例如 .$abc123!@#

如果代码拒绝有效的显示名称,可能是因为括号是按字面匹配的,而不是表示一个组(我不确定 JS 中的引用约定)。

0赞 Andy 8/21/2008 #5

我测试了你的脚本并干预了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>
0赞 Andrew G. Johnson 8/21/2008 #6

对不起,伙计们,我应该更具体。每当我添加空格时,这些值仍然被接受。美元符号成功了!$

0赞 Robert Swisher 8/21/2008 #7

一种更简单的写法仍然是

var name_regex = /^([a-z0-9_])+$/i;
0赞 travis 8/21/2008 #8

更简单:

var name_regex = /^\w+$/;