Javascript 正则表达式返回 true..然后假的..然后真的..等

2022-08-30 04:10:11

我在表单上编写的验证有一个奇怪的问题。它是输入旁边的“检查用户名”按钮。输入默认值是用户名,例如“betamax”。当我按“检查用户名”时,它会传递正则表达式并将用户名发送到服务器。服务器的行为符合预期,并返回“2”以告诉javascript他们正在提交自己的用户名。

然后,当我再次单击该按钮时,正则表达式失败。显然,不会向服务器发送任何内容,因为正则表达式已失败。如果我再次按下按钮,正则表达式通过,然后将用户名发送到服务器。

我真的不知道是什么让它这样做!这对我来说毫无意义!

编辑:我已经在Firefox和Chrome(mac)中测试了这个问题

这是我的代码:

$j("#username-search").click(checkUserName);

function checkUserName() {
    var userName = $j("#username").val();


    var invalidUserMsg = 'Invalid username (a-zA-Z0-9 _ - and not - or _ at beginning or end of string)';
    var filter = /^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
    if (filter.test(userName)) {
        console.log("Pass")
        $j.post(
        "/account/profile/username_check/", 
        { q: userName }, 
        function(data){
            if(data == 0) {
                $j("#username-search-results").html("Error searching for username. Try again?");
            }
            else if(data == 5) {
                $j("#username-search-results").html(invalidUserMsg);
            }
            else if(data == 4) {
                $j("#username-search-results").html("Username too short or too long.");
            }
            else if(data == 2) {
                $j("#username-search-results").html("This is already your username.");
            }
            else if(data == 3) {
                $j("#username-search-results").html("This username is taken.");
            }
            else if(data == 1){
                $j("#username-search-results").html("This username is available!");
            }
        });
    } else {
        console.log("fail")
        $j("#username-search-results").html(invalidUserMsg);
    }

    return false;

}

The HTML:

<input name="username" id="username" value="{{ user.username }}" />
<input type="button" value="Is it taken?" id="username-search">
<span id="username-search-results"></span>

答案 1
/^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;

您正在使用(全局).在 JavaScript 中,全局正则表达式具有状态:您第一次调用它们(with 等),您将获得给定字符串中的第一个匹配项。再次调用它们,您将获得下一个匹配项,依此类推,直到您没有匹配项并且它重置为下一个字符串的开头。您也可以通过写入来重置此状态。gRegExpexectestregex.lastIndex= 0

(这当然是一个绝对可怕的设计,肯定会混淆并导致奇怪的错误。欢迎来到 JavaScript!

您可以从 中省略 ,因为您只测试一个匹配项。gRegExp

另外,我认为你不想在前面和后面。这将允许任何字符在每一端,即。 将是有效的。你可能正在考虑 lookahead/lookbehind 断言,但它们在 JavaScript 中不可用。(嗯,Lookahead应该是,但它在IE中已经坏了。建议改为:[^-_]*plop!

/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i

答案 2
[a-z0-9-_]

这是错误的,最后一个必须在开头或结尾。-

[a-z0-9_-]

这是否会导致这个问题,我不知道。

附加说明:

第一个和最后一个字符允许为任何不被限制或被限制为-_a-z0-9

a-z0-9不包含大写字符。你需要这样做。 可以缩短到大多数正则表达式引擎中。我还没有在JavaScript中尝试过。a-zA-Z0-9a-zA-Z0-9_\w