JavaScript regex возвращающий true.. затем ложь.. затем верный.. и т.д. [дубликат]

Этот вопрос уже имеет ответ здесь:

У меня есть странная проблема с проверкой, которую я пишу на форме. Это - кнопка 'Check Username' рядом с входом. Входное значение по умолчанию является именем пользователя, например, 'betamax'. Когда я нажимаю 'Check Username', он передает regex и отправляет имя пользователя на сервер. Сервер ведет себя как ожидалось и возвращается '2', чтобы сказать JavaScript, что они отправляют свое собственное имя пользователя.

Затем когда я нажимаю кнопку снова, сбои regex. Ничто не отправляется на сервер, очевидно, потому что regex перестал работать. Если я нажимаю кнопку снова, передачи regex, и затем имя пользователя отправляется на сервер.

Я буквально не могу выяснить то, что заставило бы его сделать это! Это не имеет никакого смысла мне!

Править: Я протестировал проблему в 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:




97
задан betamax 13 April 2010 в 14:49
поделиться

2 ответа

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

Вы используете g (глобальное) RegExp . В JavaScript глобальные регулярные выражения имеют состояние: вы вызываете их (с помощью exec , test и т. Д.) В первый раз, вы получаете первое совпадение в заданной строке. Вызовите их снова, и вы получите следующее совпадение, и так до тех пор, пока вы не найдете совпадения, и он сбрасывается до начала следующей строки. Вы также можете написать regex.lastIndex = 0 , чтобы сбросить это состояние.

(Это, конечно, абсолютно ужасный дизайн, который гарантированно запутает и вызовет странные ошибки. Добро пожаловать в JavaScript!)

Вы можете опустить g из своего RegExp ], поскольку вы проверяете только один матч.

Кроме того, я не думаю, что вам нужны [^ -_] спереди и сзади. Это позволит любой символ на каждом конце, т.е. * шлеп! будет действительным. Вы, вероятно, думаете об утверждениях просмотра вперед / назад, но они недоступны в JavaScript. (Предполагается, что упреждающий просмотр не работает, но в IE он не работает.) Предложите вместо этого:

/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i
187
ответ дан 24 November 2019 в 05:26
поделиться
[a-z0-9-_]

Это неправильно, Последние - должны быть в начале или в конце.

[a-z0-9_-]

Вызвало бы это проблему или нет, я не знаю.

Дополнительные примечания:

Первым и последним символами могут быть любые символы, не являющиеся - или _, а не ограниченные a-z0-9

a-z0-9 не включает заглавные символы. Для этого нужно a-zA-Z0-9. a-zA-Z0-9_ может быть сокращено до \w в большинстве движков RegEx. Я не пробовал делать это в JavaScript.

2
ответ дан 24 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: