Soru Javascript regex true döndürüyor ... sonra false .. o zaman true .. etc [duplicate]


Bu sorunun zaten bir cevabı var:

Bir form üzerinde yazdığım doğrulama ile garip bir problemim var. Bir girdinin yanındaki 'Kullanıcı Adını Denetle' düğmesidir. Giriş varsayılan değeri, 'betamax' gibi kullanıcı adıdır. 'Kullanıcı Adını Kontrol Et' düğmesine bastığımda, normal ifadeyi geçirir ve kullanıcı adını sunucuya gönderir. Sunucu beklendiği gibi davranır ve javascript'e kendi kullanıcı adlarını gönderdiklerini bildirmek için '2' değerini döndürür.

Daha sonra düğmeye tekrar tıkladığımda, normal ifade başarısız olur. Sunucuya hiçbir şey gönderilmez çünkü normal ifadeler başarısız oldu. Düğmeye tekrar basarsam, normal ifadeler geçer ve ardından kullanıcı adı sunucuya gönderilir.

Ben bunu ne yaptığını tam olarak anlayamıyorum! Benim için hiçbir anlam ifade etmiyor!

Düzenleme: Sorunu Firefox ve Chrome'da (mac) test ettim

Bu benim kodum:

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

76
2018-04-13 14:40


Menşei




Cevaplar:


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

Sen kullanıyorsun g (Global) RegExp. JavaScript'te global regexen'in durumu var: exec, test vb) ilk kez, belirli bir dizede ilk maçı alırsınız. Onları tekrar arayın ve bir sonraki eşleşmeyi elde edersiniz, böylece eşleşme elde edinceye kadar ve sonraki dizenin başlangıcına sıfırlanır. Ayrıca yazabilirsiniz regex.lastIndex= 0 bu durumu sıfırlamak için

(Bu, elbette ki, garip hatalara yol açacak ve sebep olacak şekilde garanti edilen, kesinlikle korkunç bir tasarım parçası. JavaScript'e hoş geldiniz!)

İhmal edebilirsiniz g senden RegExpÇünkü sadece bir maç için test ediyorsun.

Ayrıca, istediğini sanmıyorum [^-_] ön ve arkada. Bu izin verecek herhangi her uçta karakter, yani. *plop! geçerli olurdu. Muhtemelen lookahead / lookbehind iddialarını düşünürsünüz, ancak bunlar JavaScript'te mevcut değildir. (Eh, lookahead olması gerekiyordu, ama IE'de bozuldu.) Önermek yerine:

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

140
2018-04-13 14:54



Bugün yeni bir şey öğrendim! Daha önce JS'de RegEx ile hiç ilgilenmedim. :) - Powerlord
Bu kadar. Normalde alışkanlıktan dışarı çıkarım ama sanırım artık yapmayacağım! Teşekkürler! - betamax
+1 Sadece "regexen" kelimesinin kullanımı için söylemek istedim, ama her yönüyle harika bir cevap ;-) - Andy E
Ünlü @bobince! Bunu paylaştığın için teşekkürler. - maček
Bence kadınlar regex.test Bir tarihte çıkacaklarsa cevaplarını vermek. - toddmo


[a-z0-9-_]

Bu yanlış, son - başlangıçta veya sonunda olmalı.

[a-z0-9_-]

Bu soruna sebep olsun ya da olmasın, bilmiyorum.

Ek Notlar:

İlk ve son karakterlerin, olmayan herhangi bir karakter olmasına izin verilir. - veya _ kısıtlanmaktan ziyade a-z0-9

a-z0-9 büyük harf içermiyor. İhtiyacın var a-zA-Z0-9 bunun için. a-zA-Z0-9_ kısaltılabilir \w çoğu RegEx motorlarında. JavaScript'te denemedim.


2
2018-04-13 14:44



Bahşiş için teşekkürler. Sipariş neden tam olarak önemlidir? Maalesef, gördüğüm problemi çözmedi. Ben sadece kromda test ettim (Firefox kullanıyordum) ve aynı şeyi yapıyor. - betamax
-Gruplardaki özel bir karakter ... gördüğünüz gibi, çünkü a-z. Bu sebepten dolayı, sadece bir edebi olmak olarak tanımlanır. - bir RegEx'in ilk veya son karakteri olarak. Bunu söyledikten sonra onu değiştirmeniz gerekebilir. [^-_] de (için [^_-]). - Powerlord
Whoops, sadece fark ettim /w yerine \w cevabımda. Şimdi düzeltilmelidir. - Powerlord
RegEx'in sonunda, büyük / küçük harf duyarlı kılan “i” bayrağım var. RegEx'de fark ettiğim bir diğer kusur, dizgenin başlangıcında BUT - ya da _ (yani, betamax £ geçerli olacaktır) bir şey kabul etmesidir. Bunu dikkate alarak ve bobince tarafından belirtilen düzeltmeyi dikkate alarak, son RegEx /^[a-z0-9]([a-z0-9_-]{4,20})[a-z0-9]$/i - betamax
Alternatif olarak kullanabilirsiniz \- Bir karakter grubunda herhangi bir yere bir heceli tire koymak. Bu yaklaşım muhtemelen daha okunabilir! Eh, regex standartlarına göre ... @betamax: evet, sadece kendimi tespit ettim ve ekledim! :-) - bobince