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

我做错了什么?[Javascript正则表达式],javascript,regex,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>

所以我写了一份登记表,我需要显示的名称只有数字,字母和下划线

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

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


它显然被删减了,不包括任何与问题无关的内容,但即使是这个代码片段也不起作用。

我的regexp将遵循以下思路:
/^[a-zA-Z0-9\]+$/


编辑:我认为是因为缺少行尾而失败。

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

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

您的正则表达式

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

  • 字符串的开头(检查),后跟
  • 一个或多个字母、数字或下划线(选中)
  • 之后发生的一切都无关紧要。只要以字母、数字或下划线开头,这个正则表达式就可以匹配任何内容

    如果将
    $
    放在末尾,则它将起作用-
    $
    匹配“字符串结尾”,因此它唯一可以匹配的方法是在字符串的开头和结尾之间只有数字、字母和下划线

    /^([a-zA-Z0-9_])+$/
    
    其次,我建议使用
    document.getElementById('display-name').value
    而不是
    document.forms
    ,因为如果重新排列HTML,它不会中断,而且更像是“通常接受的操作标准”

    什么是“不工作”的意思?它是否拒绝有效的显示名称?它是否接受无效的显示名称?哪一个

    按照@Annan的说法,去掉
    $
    将使regexp接受无效的显示名称,如
    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+$/;
    

    \w是字母、数字和下划线的缩写。我将其简化为/^\w+$/@Juan,在大多数语言中,作为单词字符的内容取决于系统和语言环境,JS中不是这样吗?大多数正则表达式引用列表\w只是[a-zA-Z_0-9]的快捷方式。Java的:。PHP使用POSIX,它基本上说了相同的事情。也适用于JS<代码>/\w/.test(“é”)
    在我的语言环境设置为pt br时返回false。我从未听说过\w在检测其他地区时非常聪明。