Dizeden alfasayısal olmayan karakterleri kaldır


224

Aşağıdaki dizeyi sağlanan çıktıya dönüştürmek istiyorum.

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

Ben gibi özel karakterleri idare edecek herhangi bir çözüm bulunamazsa ettik \r, \n, \bvb

Temelde sadece alfasayısal olmayan herhangi bir şeyden kurtulmak istiyorum. İşte denedim ...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

Birden fazla adımla bir deneme daha

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

sonuçlarla

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

Herhangi bir yardım mutluluk duyacağız.

Çalışma Çözümü:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"

İlginç bir soru, \ new in \ new bunu tetikleyen şeydir. Nasıl bulacağımı ve değiştireceğimi tam olarak bilmiyorum, ancak beyaz özel karakterlerde normal ifadeyi arıyor
Will Buck

1
Girişler kaçtı mı / nasıl atandılar? var Input = "\\test\red\bob\fred\new"bu dize "kırmızı" içermez, bu yüzden ilk denemeniz doğrudur, okuryazarlığa karşı test yapıyor "\\\\test\\red\\bob\\fred\\new"musunuz?
Alex K.

/[^\w\s]+/gibunu dene.
Bartosz Grzybowski

Sanırım soru, giriş dizenizdeki ters eğik çizgiler özel karakterleri temsil ediyor mu? (Örnek çıktınıza göre, hayır tahmin ediyorum.)
Dave

Çift tırnak işaretinden tek tırnak işaretine geçmeyi denediniz mi?
OptimusCrime

Yanıtlar:


470

Alfasayısal olmayan karakterleri kaldırma

Alfanümerik olmayan karakterleri bir girdi dizesinden çıkarmak için / a doğru regex'i aşağıda bulabilirsiniz:

input.replace(/\W/g, '')

Bunun \Weşdeğer olduğuna dikkat edin [^0-9a-zA-Z_]- alt çizgi karakterini içerir. Alt çizgileri kaldırmak için örneğin:

input.replace(/[^0-9a-z]/gi, '')

Giriş hatalı biçimlendirilmiş

Test dizesi alfasayısal olmayan çeşitli çıkış karakterleri içerdiğinden bunları kaldıracaktır.

Kelimenin tam anlamıyla alınacaksa, dizedeki ters eğik çizginin kaçması gerekir:

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

Hatalı biçimlendirilmiş dizeleri işleme

Giriş dizesinden doğru şekilde kaçamıyorsanız (neden olmasın?) Ya da bir tür güvenilmeyen / yanlış yapılandırılmış kaynaktan geliyorsa - böyle bir şey yapabilirsiniz:

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

Bir dizenin json temsilini tırnak içine aldığını unutmayın:

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

Ancak, normal regex tarafından da kaldırılır.


10
Bu alt çizgileri kaldırmaz.
kylex

4
@kylex, bunun nedeni, alt çizgilerin alfanümerik
demetlerin

12
"Çünkü bunlar değişken tanımlayıcılarda genellikle yasal olan karakterlerdir." . Tabii değiştirme, söz konusu "_" hayır yok \Wolan [_\W](söz konusu kullanılır) veya ortadan kaldıracak benzer çizgi.
AD7six

1
@ AD7six, dize güvenilir olmayan bir kaynaktan geliyorsa neden JSON.stringify () kullanmanız gerektiğini açıklar mısınız? Bunu yapmamak için herhangi bir güvenlik sorunu var mı? Teşekkürler!
jbmusso

1
@guithor "Kişinin" olması gerektiği veya güvenliği hiç etkilemediği; "Bazı dize" alınıyorsa ve herhangi bir nedenle temelde doluysa (Dizenin neden yanlış biçimlendirildiği sorusundan belli değil) - ne olduğu için dizeyi görmeye izin verir: jsfiddle.net/Z6N7C
AD7six

49

Mevcut tüm cevapların hala tuhaflıkları var, ortaya çıkabilecek en iyi şey şuydu:

string.replace(/[^A-Za-z0-9]/g, '');

Heres klavyede bulabildiğim her anahtarı yakalayan bir örnek:

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

Çıkışlar: '123abcABC'


1
input.replace(/\W/g, '')_bir dize bırakır . @Deminetix, String'den string.replace(/[^A-Za-z0-9]/g, '');tüm alfasayısal olmayan karakterleri kaldırdığından daha iyi çalışır.
Tim

1
Ve yine de, bu sorunun hiçbir permütasyonu aslında sorulan soruya cevap vermez .
AD7six

10

Sorun, karakterleri nasıl değiştirdiğinizle değil, sorun dizeyi nasıl girdiğinizle ilgilidir.

Bu bir ters eğik çizgi karakteri girdi yalnızca ilk ters eğik çizgi var, diğerleri kontrol karakterleri bir parçası olan \r, \b, \fve \n.

Bu ters eğik çizgiler ayrı karakterler değil, tek bir denetim karakteri yazmak için gösterimin bir parçası olduğu için ayrı ayrı kaldırılamaz. Yani, \niki ayrı karakter olmadığından ters eğik çizgiyi kaldıramazsınız , kontrol karakterini LFveya satır beslemesini yazma yönteminizdir .

Eğer acutally istenilen çıkış içine girdi çevirmek istiyorsanız, örneğin, ilgili harfi ile her bir kontrol karakteri değiştirmek karakterini değiştirmek gerekir \nkarakteri ile n.

Bir kontrol karakterini değiştirmek için [\r], \rnormal ifadede özel bir anlamı olduğu gibi bir karakter kümesi kullanmanız gerekir :

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

Demo: http://jsfiddle.net/SAp4W/


Söylediğin her şeyi anlıyorum ama soru hala duruyor ve henüz kimse doğru cevabı önermedi. Giriş değişebilir, ancak hiç kimse JS'de programlı olarak nasıl değiştirileceğine dair bir cevap önermemiştir.
Bobby Cannon

2
@BobbyCannon: Tam girişinizi alan ve istenen çıktıyı üreten bir kod ekledim.
Guffa

5

bu normal ifadeyi deneyebilirsiniz:

value.replace(/[\W_-]/g, '');

soru başına: Sadece alfasayısal olmayan herhangi bir şeyden kurtulmak istiyorum. hangi çıktıyı bekliyordun?
myrcutio

0

Bu, alfasayısal olmayan tüm karakterleri kaldırır, büyük harf kullanımını korur ve kelimeler arasındaki boşlukları korur.

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123

Bu işe yaramaz (lütfen soruyu okuyun) - Aynı zamanda işleri yapmanın oldukça karmaşık bir yoludur.
AD7six

1
@ AD7six hatamı belirttiğin için teşekkür ederim. Girişi WebStrom'a yapıştırdığımda, mevcut her ters eğik çizgiye otomatik olarak 2 ekstra ters eğik çizgi ekledi. Bunu not edemedim. input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new".
Flavio

-1

İşte kullanabileceğiniz bir örnek,

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");

-3

Bu \\test\red\bob\fred\newdizeye sahip olmak istiyorsanız , tüm ters eğik çizgilerden ( \) kaçmalısınız . Dizenizi yazdığınızda \\test\\red\\bob\\fred\\newaslında tek ters eğik çizgi içerir. Bu dizeyi yazdırdığınızdan emin olabilirsiniz.
Bu nedenle, dizenizdeki ters eğik çizgiler kaçarsa myString.replace(/\W/g,'')normal şekilde çalışır.


1
Eğer "tüm ters eğik çizgilerden () kaçmalısınız" diye önermek isterseniz, bunun nasıl yapılacağı ile ilgili bir örnek vermeniz gerekir.
Bobby Cannon

Ne şey çift ters eğik çizgiler ??? Demek istediğim, "\ \ test \\ red \\ bob \\ fred \\ new yazdığınızda dizeniz aslında tek ters eğik çizgi içeriyor." ??? Bu açıklamıyor mu?
shift66

Giriş "\\ test \ red \ bod \ fred \ new" şeklindedir ve değiştirilemez. Bu giriş dizesi için bir çözüme ihtiyacım var. Bana "ters eğik çizgileri nasıl çıkaracağımızı" göstermek istiyorsanız, o zaman bir örnek verin. Girişi değiştiremeyiz. Kabul edilen cevaba bakınız. Çözelti, girdinin değişmesine izin verdi, ancak istenen çıktıyı verdi.
Bobby Cannon
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.