【问题标题】:Javascript regex returning true.. then false.. then true.. etc [duplicate]Javascript正则表达式返回true..然后是false..然后是true..等[重复]
【发布时间】:2011-02-07 11:52:20
【问题描述】:

我在表单上写的验证有一个奇怪的问题。它是输入旁边的“检查用户名”按钮。输入默认值是用户名,例如“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;

}

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>

【问题讨论】:

    标签: javascript jquery html ajax regex


    【解决方案1】:
    /^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
    

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

    (这当然是一个绝对糟糕的设计,肯定会造成混乱并导致奇怪的错误。欢迎使用 JavaScript!)

    您可以从RegExp 中省略g,因为您只测试一场比赛。

    另外,我认为您不希望 [^-_] 出现在前面和后面。这将允许 any 字符在每一端,即。 *plop! 将是有效的。您可能正在考虑前瞻/后瞻断言,但它们在 JavaScript 中不可用。 (好吧,应该是前瞻,但它在 IE 中被破坏了。)建议改为:

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

    【讨论】:

    • 就是这样。我通常出于习惯包含 /g 但我想我不会再这样做了!谢谢!
    • 我想如果你用捕获组创建一个全局正则表达式并在上面调用test,这是一个疯狂的请求——你要测试什么捕获组?不要为 javascript 找借口,他们选择了最疯狂的解决方案来解决一个有点疯狂的问题..
    • 这里是developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,谢谢@bobince,我不知道:)
    • 如果这是您正在寻找的答案,是时候学习正则表达式了
    【解决方案2】:
    [a-z0-9-_]
    

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

    [a-z0-9_-]
    

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

    补充说明:

    第一个和最后一个字符可以是任何不是-_ 的字符,而不是限制为a-z0-9

    a-z0-9 不包含大写字符。为此,您需要a-zA-Z0-9。 在大多数 RegEx 引擎中,a-zA-Z0-9_ 可以缩短为 \w。我还没有在 JavaScript 中尝试过。

    【讨论】:

    • 感谢您的提示。为什么顺序很重要?不幸的是,这并没有解决我看到的问题。我刚刚在 chrome 中测试了它(使用的是 Firefox),它做同样的事情。
    • - 是组中的一个特殊字符...如您所见,因为您将它用于a-z。因此,它被定义为仅作为正则表达式的第一个或最后一个字符的文字 -。话虽如此,您可能还需要将其切换到[^-_](到[^_-])。
    • 哎呀,我刚刚注意到我在答案中输入了/w 而不是\w。现在应该修好了。
    • 我在 RegEx 的末尾有一个 'i' 标志,这使它不区分大小写。我在 RegEx 中注意到的另一个缺陷是它在字符串的开头接受任何 BUT - 或 _ (即 betamax£ 将是有效的)。因此,考虑到这一点和 bobince 提到的修复,最终的正则表达式是 /^[a-z0-9]([a-z0-9_-]{4,20})[a-z0-9]$/i
    • 您也可以使用\- 在字符组中的任意位置放置文字连字符。这种方法可能更具可读性!好吧,按照正则表达式标准...... @betamax:是的,我自己发现了它并添加了它! :-)
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2018-06-27
    • 2018-03-31
    • 2021-03-16
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多