Rimuovere i caratteri non alfanumerici dalla stringa


224

Voglio convertire la seguente stringa nell'output fornito.

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

Non ho trovato alcuna soluzione che consente di gestire caratteri speciali come \r, \n, \b, etc.

Fondamentalmente voglio solo sbarazzarmi di tutto ciò che non è alfanumerico. Ecco cosa ho provato ...

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"

Un altro tentativo con più passaggi

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]/ , "");
}

con risultati

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

Qualsiasi aiuto sarebbe apprezzato.

Soluzione di lavoro:

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

Domanda interessante, il \ n in \ nuovo è chiaramente ciò che fa scattare questo. Non sono del tutto sicuro di come trovarlo e sostituirlo, anche se va alla ricerca di regex su caratteri speciali whitespate
Will Buck,

1
Gli ingressi sono sfuggiti / come vengono assegnati? var Input = "\\test\red\bob\fred\new"questa stringa non contiene "rosso", quindi il tuo primo tentativo è corretto, stai testando contro la lettera "\\\\test\\red\\bob\\fred\\new"?
Alex K.

/[^\w\s]+/giprova questo.
Bartosz Grzybowski,

Immagino che la domanda sia: le barre rovesciate nella stringa di input rappresentano caratteri speciali? (Sulla base del tuo esempio, suppongo di no.)
Dave,

Hai provato a passare da virgolette doppie a virgolette singole?
OptimusCrime,

Risposte:


468

Rimozione di caratteri non alfanumerici

Di seguito è il / a regex corretto per rimuovere i caratteri non alfanumerici da una stringa di input:

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

Nota che \Wè l'equivalente di [^0-9a-zA-Z_]- include il carattere di sottolineatura. Per rimuovere anche i trattini bassi usare ad esempio:

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

L'ingresso non è corretto

Poiché la stringa di test contiene vari caratteri di escape, che non sono alfanumerici, li rimuoverà.

Una barra rovesciata nella stringa deve essere salvata se deve essere presa alla lettera:

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

Gestione di stringhe non valide

Se non riesci a sfuggire correttamente alla stringa di input (perché no?) O proviene da una fonte non attendibile / non configurata correttamente, puoi fare qualcosa del genere:

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

Nota che la rappresentazione json di una stringa include le virgolette:

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

Ma sono anche rimossi dal regex sostitutivo.


10
Questo non rimuove i trattini bassi.
Kylex,

4
@kylex, perché i trattini bassi sono considerati parte del gruppo alfanumerico, per qualche ragione
Eugene Kuzmenko

12
"Perché sono i caratteri generalmente legali negli identificatori di variabili." . Non c'è "_" nella domanda, ovviamente sostituendolo \Wcon [_\W](che è usato nella domanda) o simili rimuoverà i trattini bassi.
AD7six

1
@ AD7six, potresti spiegare perché si dovrebbe usare JSON.stringify () quando la stringa proviene da una fonte non attendibile? C'è qualche problema di sicurezza a non farlo? Grazie!
jbmusso,

1
@guithor Non è che "uno dovrebbe", o che influisca sulla sicurezza; Se viene ricevuto "un po 'di stringa" e per qualsiasi motivo è sostanzialmente interrotto (non risulta dalla domanda perché la stringa viene ricevuta in modo non corretto) - consente di vedere la stringa per quello che è: jsfiddle.net/Z6N7C
AD7six

49

Tutte le risposte attuali hanno ancora delle stranezze, la cosa migliore che ho potuto trovare è stata:

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

Ecco un esempio che cattura tutti i tasti che ho trovato sulla tastiera:

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

Uscite: "123abcABC"


1
input.replace(/\W/g, '')lascia in _in una stringa. @Deminetix ha ragione string.replace(/[^A-Za-z0-9]/g, '');funziona meglio poiché rimuove tutti i caratteri non alfanumerici dalla stringa.
Tim

1
Eppure, nessuna permutazione di questa risposta risponde effettivamente alla domanda posta .
AD7,

10

Il problema non è con come si sostituiscono i caratteri, il problema è con come si immette la stringa.

È solo la prima barra rovesciata in ingresso che è un carattere rovesciato, gli altri sono parte dei caratteri di controllo \r, \b, \fe \n.

Poiché tali barre rovesciate non sono caratteri separati, ma fanno parte della notazione per scrivere un singolo carattere di controllo, non possono essere rimossi separatamente. Vale a dire non è possibile rimuovere la barra rovesciata \npoiché non si tratta di due caratteri separati, è il modo in cui si scrive il carattere di controllo LFo l' avanzamento di riga .

Se si desidera trasformare tale input nell'output desiderato, è necessario sostituire ciascun carattere di controllo con la lettera corrispondente, ad esempio sostituire il carattere \ncon il carattere n.

Per sostituire un personaggio di controllo devi usare un set di caratteri simile [\r], così come \rha un significato speciale in un'espressione regolare:

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/


Capisco tutto quello che stai dicendo, ma la domanda è ancora valida e nessuno ha ancora suggerito la risposta corretta. L'input può essere modificato ma nessuno ha suggerito una risposta su come modificarlo a livello di codice in JS.
Bobby Cannon,

2
@BobbyCannon: ho aggiunto il codice che prende il tuo input esatto e produce l'output desiderato.
Guffa,

5

puoi provare questo regex:

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

per la domanda: voglio solo liberarmi di tutto ciò che non è alfanumerico. quale uscita ti aspettavi?
myrcutio,

0

Ciò rimuove tutti i caratteri non alfanumerici, conserva le maiuscole e preserva gli spazi tra le parole.

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

Che non funziona (si prega di leggere la domanda) - E 'anche un modo piuttosto complesso di fare le cose.
AD7 settembre

1
@ AD7six grazie per aver segnalato il mio errore. Quando copio incollato l'input in WebStrom, vengono aggiunti automaticamente 2 barre rovesciate aggiuntive a ciascuna barra rovesciata esistente. Non sono riuscito a notarlo. input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new".
Flavio

-1

Ecco un esempio che puoi usare,

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

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

-3

Se vuoi avere questa \\test\red\bob\fred\newstringa, dovresti evitare tutte le barre rovesciate ( \). Quando scrivi la \\test\\red\\bob\\fred\\newtua stringa contiene in realtà singole barre rovesciate. Puoi essere sicuro di questo stampa la tua stringa.
Quindi, se le barre rovesciate nella stringa sono sfuggite myString.replace(/\W/g,'')funzionerà normalmente.


1
Se vuoi suggerire "dovresti sfuggire a tutte le barre rovesciate ()", devi fornire un esempio su come farlo.
Bobby Cannon,

Cosa ne pensi sono doppie barre rovesciate ??? e cosa intendo dire "Quando scrivi \\ test \\ red \\ bob \\ fred \\ new la tua stringa contiene in realtà singole barre rovesciate." ??? Questo non sta spiegando?
shift66,

L'input è "\\ test \ red \ bod \ fred \ new" e non può essere modificato. Ho bisogno di una soluzione per quella stringa di input. Se vuoi mostrarmi come "sfuggire alle barre rovesciate", fai un esempio. Non possiamo modificare l'input. Vedi la risposta accettata La soluzione consentiva che l'input non cambiasse ma forniva l'output desiderato.
Bobby Cannon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.