RegExp ile tüm özel karakterleri kaldırın


234

Bir dizeden tüm özel karakterleri kaldıracak RegExp istiyorum. Ben böyle bir şey deniyorum ama Firefox'ta çalışıyor olsa da, IE7 çalışmıyor.

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

RegExp'in ayrıntılı bir açıklaması da yardımcı olacaktır.


18
Böyle bir şey bir kara liste olarak değil, bir beyaz liste olarak daha iyi olurdu. o zaman sadece [az] | [0-9] | \ s
Ape-inago

Herhangi bir komut dosyası hatası var mı? Hata ayıkladınız mı? Ya da javascript koduna bir try ... catch bloğu koyun.
Kangkan

@ Ape-
inago

3
Lütfen "özel karakter" i tanımlayın! "風" sizin için özel mi? (Bunu düşünerek @ Ape-iango'nun noktasını göreceksin.)
deceze

7
Buradaki kimsenin herhangi bir suç anlamına geldiğini düşünmüyorum. Daha önce kara liste olarak yaparak yanmıştım, çünkü her zaman geçmekte olan küçük "gotcha'lar" vardır (deceze'nin örnekleri gibi). Sonuçta doğru yaklaşım, neden bunu yapmaya çalıştığınızla ilgilidir.
Ape-inago

Yanıtlar:


613
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

Yorumlarda belirtildiği gibi, bunu bir beyaz liste olarak yapmak daha kolaydır - güvenli listenizde olmayan karakterleri değiştirin .

Şapka ( ^) karakter kümesi olumsuzlanmasıdır [...], gidemek global ve küçük harf duyarsız (ikincisi biraz gereksiz olduğunu ama bunu belirtmek istedim) ve bu örnekte safelist rakam, kelime karakterler, alt çizgi (olup \w) ve boşluk ( \s).


50
Bu çözüm İngilizce olmayan semboller için geçerli değildir. "Їжак" örneğin.
Martı

4
^ \ W yerine \ W büyük harfini de kullanabilirsiniz. \ W: Sözcük olmayan karakterlerle eşleşir. [^ A-Za-z0-9_] ile eşdeğerdir. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Guide/…
delkant

@Seagull Unicodes'u işleyen bir yanıt ekledim.
freedev

1
aksan kelimelerini kabul etmek için, portekizce gibi, şunu yapın: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27

1
Çoğu Avrupa dilini eklemek için (Norveççe, İsveççe, Almanca, Portoguise, İspanyolca) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Diğer dilleri dahil etmek için unicode aralıkları kullanılabilir. Bakınız: stackoverflow.com/questions/150033/…
Eskil Mjelva Saatvedt

105

Eğik çizgiler ve özel karakterler gibi bir kümeyi yine de hariç tutmak istiyorsanız aşağıdakileri yapabileceğinizi unutmayın:

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

"eksi" karakterini de eklemek için, ikinci grup gibi bir ters eğik çizgi ile kaçmanız gerektiğini unutmayın. eğer yapmazsanız, muhtemelen istenmeyen 0-9'u da seçecektir.


10
mükemmel çözüm! kabul edilen cevap sadece İngilizce olarak çalışır, bu herhangi bir dilde çalışır (kontrol ettiğim kadarıyla). teşekkürler :)
Ronen Ness

1
@ knutole ?karakter kümesi kısmından öne doğru kaldırır . bu, kaldırmak istediğiniz karakterleri listeler; bu nedenle, soyulmalarını hariç tutmak, karakteri nihai sonuca dahil eder.
noinput

Bu harika çalışıyor, herhangi bir dil için mükemmel uyuyor, sadece değiştirmek istediğiniz karakteri eklemeniz gerekiyor ve hepsi bu. Teşekkürler.
Elros Romeo

21

Düz Javascript normal ifadesi Unicode harfleri işlemez .

Kullanmayın [^\w\s], bu aksanlı harfleri (àèéìòù gibi) kaldıracak, Kiril veya Çince'ye değinmeyecek, bu dillerden gelen harfler kaldırılacaktır.

Bu harfleri tüm özel karakterlerle birlikte kaldırmak istemezsiniz. İki şansınız var:

  • Senin regex sen kaldırmayı istemediğiniz tüm özel karakterleri ekleme
    örneğin: [^èéòàùì\w\s].
  • Xregexp.com'a bir göz atın . XRegExp, \p{...}sözdizimi yoluyla Unicode eşleştirmesi için temel destek ekler .

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>


3
Uluslararasılaşma için bilmek iyi, JS regex UTF-8 fikirli değildi hiçbir fikrim yoktu.
LessQuesar

Geçerli tüm UTF-8 harflerini var str'ye yerleştiremezsiniz
Seagull

@Seagull evet, ancak dünya çapında uyumlu bir uygulama yazmıyorsanız, geçerli yerelleştirmeleriniz için yalnızca geçerli UTF-8 harflerinin listesini pragmatik olarak koyabilirsiniz. Benim durumumda, İtalyanca için sadece birkaç harf var.
freedev

7

İlk çözüm herhangi bir UTF-8 alfabesi için çalışmaz. (Їжак gibi metinleri keser). RegExp kullanmayan ve JavaScript motorunda iyi UTF-8 desteği kullanan bir işlev oluşturmayı başardım. Bir sembol büyük harf ve küçük harf özel ise, basit bir fikirdir. Tek istisna boşluk için yapılır.

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

Güncelleme: Bu çözümün yalnızca küçük ve büyük harflerin bulunduğu diller için çalıştığını lütfen unutmayın. Çince gibi dillerde, bu işe yaramaz.

Güncelleme 2: Bulanık bir arama üzerinde çalışırken orijinal çözüme geldim. Arama işlevini uygulamak için özel karakterleri de kaldırmaya çalışıyorsanız, daha iyi bir yaklaşım vardır. Size yalnızca Latin karakterlerinden dize üretecek herhangi bir harf çevirisi kitaplığı kullanın ve daha sonra basit Regexp özel karakterleri kaldırmanın tüm sihrini yapacaktır. (Bu Çince için de işe yarayacak ve Tromsø== yaparak yan avantajlar elde edeceksiniz Tromso).


Mükemmel, bu cevap gibi! Geçerli bir dosya adı oluşturmak için kullanıyorum ve boşlukları (Linux / Unix uyumlu) kaldırmak ve sayılara izin vermek için çözümünüzü genişletmesini sağladım. Bu yüzden if ifadesini uzattım (jQuery dahil): if (str [i]! == '' && (alt [i]! = Üst [i] || alt [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny

birçok dilde büyük harf yoktur ... bu nedenle işlev geçerli girişi özel karakterler olarak kabul eder
Yair Levy

Çince karakterler bununla sıyrılmak bir örnek
lethek

Bu çözümü yarattığımda maalesef Çince gibi dilleri düşünmüyordum. Önceki cevaplar da işe yaramayacağından çözüm önerilmelidir.
Martı

1

RegexBuddy benim regexes hata ayıklamak için çok yararlı neredeyse tüm dilleri kullanın. Daha sonra hedeflenen dil için kopyala / yapıştır. Müthiş bir araç ve çok pahalı değil.

Bu yüzden regex'inizi kopyaladım / yapıştırdım ve sorununuz [,] regex'te özel karakterler olduğu için onlardan kaçmanız gerekiyor. Bu nedenle normal ifade: /!@#$^&%*()+=-[\x5B\x5D yetersiz\/{#|:<>?,./im


0

neden böyle bir şey yapmıyorsun:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

girişinizde özel karakter olup olmadığını kontrol etmek için


17
OP, var olup olmadığını görmeyen özel karakterleri kaldırmaya çalıştığını söylüyor.
annakata

Bu iyi bir çözümdür, ancak bu sadece İngilizce alfabe harf numaralarına ve boşluğa izin verecektir, ancak bu gibi karakterleri kaldıracaktır èéòàùìve bazı durumlarda bu çözüm olmayacaktır
mapmalith

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")Ben böyle yaptım. Ama bunu daha kolay yapan bazı insanlar varstr.replace(/\W_/g,"");


\WBazı karakterleri içerdiğinden , yaklaşımınızdaki şeylerin çoğu gereksizdir . Ama sayıları neden filtrelesin? Bunlar özel karakterler değil.
user4642212
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.