Javascript的正则expression式返回true ..然后false ..然后true ..等

我在写一个表单的validation有一个奇怪的问题。 这是一个input旁边的“检查用户名”button。 input的默认值是用户名,例如'betamax'。 当我按'检查用户名'它传递正则expression式并发送用户名到服务器。 服务器的行为如预期,并返回“2”告诉JavaScript,他们正在提交自己的用户名。

然后,当我再次点击button,正则expression式失败。 显然,因为正则expression式失败,所以没有任何东西被发送到服务器。 如果我再次按下button,正则expression式通过,然后用户名被发送到服务器。

我从字面上不知道会做什么这样做! 对我来说完全是无稽之谈!

编辑:我已经testing了在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> 
 /^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi; 

您正在使用g (全局) RegExp 。 在JavaScript中,全局正则expression式有一个状态:第一次调用它们(用exectest等),你得到给定string中的第一个匹配项。 再次调用它们,你会得到下一个匹配,等等,直到你没有匹配,它重置到下一个string的开始。 你也可以写regex.lastIndex= 0来重置这个状态。

(这当然是一个绝对可怕的devise,保证混淆并导致奇怪的错误。欢迎使用JavaScript!)

您可以从RegExp省略g ,因为您只能testing一场比赛。

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

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

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

 [a-z0-9_-] 

不知道是否会造成这个问题,我不知道。

补充笔记:

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

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