Sembollerle Eşleşecek Normal İfade:! $% ^ & * () _ + | ~ - = `{} []:"; '<>?,. /


96

JavaScript'te aşağıdaki karakterlerden herhangi birini içerecek bir dizeyi test edecek bir Regex testi oluşturmaya çalışıyorum:

!$%^&*()_+|~-=`{}[]:";'<>?,./

Daha Fazla Bilgi İlgileniyorsanız :)

Üzerinde çalıştığım oldukça güzel bir şifre değiştirme uygulaması için. İlgileniyorsanız, işte kodun geri kalanı.

Parola gereksinimlerini listeleyen bir tablom var ve son kullanıcılar yeni parolayı yazdıkça, bir dizi Regexes test edecek ve eğer ... kontrol ederse ilgili tablo satırına bir onay işareti koyacak :) Sadece bunu eklemem gerekiyor validationdizideki 4. öğe yerine .

var validate = function(password){
    valid = true;

    var validation = [
        RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password), 
        RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password), 
        !RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password), 
        !RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
    ]

    $.each(validation, function(i){
        if(this)
            $('.form table tr').eq(i+1).attr('class', 'check');
        else{
            $('.form table tr').eq(i+1).attr('class', '');
            valid = false
        }
    });

    return(valid);

}

Evet, ilgili sunucu tarafı doğrulaması da var!


9
Özel karakterlerden kaçmak ve eğik çizgileri kapatmak dışında, sorunuzun cevabının başlıkta yatması oldukça komik.
sciritai

1
Neden .addClass("check")ve kullanmıyorsunuz .removeClass("check")? Ve if (someBoolean == true)kodla görmek beni her zaman utandırır. Sadece yap if (someBoolean). Ya da daha iyisi, sadece yapın $(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;.
gilly3

Kod incelemesi için +1 @ gill3 thx - gerçekten harika geri bildirim. Geçmişte bu kısa el yöntemlerini kullandım.
pixelbobby

@ gilly3, FF'de harika çalışıyor gibi görünüyor ama! IE8. Bu kısa eli seviyorum. IE8'in neyi farklı yaptığını anlamaya çalışıyorum.
pixelbobby

Yanıtlar:


174

Bunun normal ifadesi gerçekten çok basit. Sadece bir karakter sınıfı kullanın. Kısa çizgi, karakter sınıflarındaki özel bir karakterdir, bu nedenle ilk olması gerekir:

/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/

Ayrıca diğer normal ifade meta karakterlerinden de kaçmanız gerekir.

Düzenleme: Kısa çizgi özeldir çünkü bir dizi karakteri temsil etmek için kullanılabilir. Aynı karakter sınıfı, aşağıdaki aralıklarla basitleştirilebilir:

/[$-/:-?{-~!"^_`\[\]]/

Üç aralık vardır. "$" - "/", ":" - "?" ve "{" - "~". son karakter dizisi daha basit bir şekilde bir aralıkla temsil edilemez:! "^ _" [].

Karakter sınıflarının aralıklarını bulmak için bir ACSII tablosu kullanın .


Karakter dizisinden kaçmak için neden \ Q ve \ E nicelik belirteçlerinden bahsedilmiyor?
SerG

Bu çözümü bulmadan önce karakter sınıfı hariç tutma rotasına giriyordum: her şeyi AMA alfa, rakamlar, beyaz boşluk vb.
Pete Alvin

1
Önce tirelerin gelmesi gerektiği genel bir bilgi mi? Düzinelerce SO yanıtı ve normal ifade hile sayfası okudum, bunu ilk duyduğum şey bu. Cevabınız beni çok drama kurtardı. Teşekkürler!
CF_HoneyBadger

2
@SerG \Qve \EJS çalışmaz RegExp :( motoru/^\Q.\E$/.test('Q+E'); // true
Paul S.

1
@ q4w56 ters eğik çizgi, orijinal soruda belirtilen karakter kümesinde değil, bu nedenle ters eğik çizgiyle eşleşmiyor doğru. :)
Jeff Hillman

7

Bunu başarmanın en basit ve en kısa yolu:

/[^\p{L}\d\s@#]/u

Açıklama

[^...] Aşağıdaki listede bulunmayan tek bir karakterle eşleştirin

  • \p{L} => herhangi bir dilden herhangi bir harfle eşleşir

  • \d => sıfır ile dokuz arasındaki bir rakamla eşleşir

  • \s => her türlü görünmez karakterle eşleşir

  • @# => @ve #karakterler

u(Unicode) bayrağını geçmeyi unutmayın .


olmadığını belirtmek için ^ işaretine ihtiyacınız olmaz mı?
Webber

1
@Webber Hayır. Başkentler ve bu ifadeyi olumsuz kılıyor. ^kullandığımız zaman \wve \sküçük harflerle gereklidir .
AmirZpr

3
Bu onu dışarıda wya da dışarıda olarak yorumlamıyor mu sve bu ikisi gerçekten kesişmediği için sadece tüm karakterlere izin veriyor mu? (Böylece hiçbir şeyi filtrelemiyor.)
Zael

2
@Zael Haklısın, belirtildiği gibi normal ifade ( /[\W\S]/) her şeyin geçmesine izin veriyor. Amir'in ulaştığına inandığım şeyin daha doğru bir temsili olurdu [^\w\s]. Birincisinde, normal ifade "alfasayısal olmayan VEYA boşluk olmayan herhangi bir şeyi eşleştir " diyor, bahsettiğiniz gibi alfanümerik karakterler beyaz boşluk olmadığından her şeyi yapalım ve bunun tersi de geçerlidir. İkincisi, "alfasayısal olmayan VE boşluk olmayan herhangi bir şeyi eşleştir" diyor . Elbette, aksanlı karakterlerin (gibi À) eşleştirilmesinde istisnalar geçerlidir [^\w\s].
Jesse

bu _ karakterini içermez
MikeSchem

5

Cevap

/[\W\S_]/

Açıklama

Bu, kelime karakterlerini, boşluk karakterlerini kaldıran ve alt çizgi karakterini geri ekleyen bir karakter sınıfı yaratır (alt çizgi bir "kelime" karakteridir). Geriye kalan tek şey özel karakterler. Büyük harfler, küçük harf karşılıklarının olumsuzlamasını temsil eder.

\Weşdeğeri olan tüm "kelime" olmayan karakterleri [^a-zA-Z0-9_]
\Sseçecek "beyaz boşluk" olmayan tüm karakterleri [ \t\n\r\f\v]
_seçecek "_" yi seçecektir çünkü onu kullanırken onu geçersiz kılıyoruz \Wve tekrar eklememiz gerekiyor


MikeSchem, beni bir zaman makinesinden geçirdin.
pixelbobby

evet, fark ettim. eskiydi ama en basit cevabın gönderilmediğini hissettim.
MikeSchem

Bu, alt çizgide başarısız olan aşağıdaki cevaptan nasıl farklıdır?
sf8193

-1
// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict
  const hasSpecial = password => {
    const specialReg = new RegExp(
      '^(?=.*[!@#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+`~\\:;,\\.€\\|])',
    );
    return specialReg.test(password);
  };

Kullanmayın RegExpsadece regex değişmezi kullanabilirsiniz zaman yapıcı. İşten çok daha az kaçar (çoğu zaten gereksizdir) ve aynı zamanda daha verimli.
Bergi

Karakteri doğrudan eşleştirebilecekken neden karmaşık bir önden okuma kullanasınız ki?
Bergi

Bir örnek verebilir misiniz @Bergi? Ne önerdiğini anlamıyorum.
Arni Gudjonsson

-1

Bunu başarmanın basit bir yolu negatif küme [^ \ w \ s] 'dir. Bu esasen şunları yakalar:

  • Alfasayısal karakter olmayan herhangi bir şey (harfler ve sayılar)
  • Boşluk, sekme veya satır sonu olmayan herhangi bir şey (toplu olarak boşluk olarak anılır)

Nedense [\ W \ S] aynı şekilde çalışmıyor, herhangi bir filtreleme yapmıyor. Zael'in cevaplardan biri üzerine yaptığı bir yorum, bir açıklama niteliğinde.


Hayır, alt çizgi eksiktir ve ascii aralığındaki tüm karakterler ve ascii aralığındaki kontrol karakterlerinin çoğu bu sınıfla eşleşir. /[^\w\s]/.test('é') # true, /[^\w\s]/.test('_') # false.
Casimir et Hippolyte

-7

"A" daki herhangi bir dildeki tüm harfleri değiştirin ve örneğin tüm rakamları 0 olarak değiştirin:

return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0");

23
Hangi soruyu cevaplıyorsunuz?
Toto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.