Voglio rimuovere le virgolette doppie da una stringa


239

Voglio rimuovere il ""around una stringa.

ad esempio se la stringa è: "I am here"allora voglio solo output I am here.


4
Perché non usi semplicemente string.replace ('"', '')
Adarsh ​​Kumar il

69
str = str.replace(/"/g,"");
Mr_Green,

11
Vuoi rimuovere TUTTE le virgolette o le virgolette?
Kos,

36
stackoverflow.com/q/19155566/989121 . Farai 255 domande, una volta per ogni carattere ASCII?
Georg

6
str = str.replace(/^"|"$/g, '');sostituisce le virgolette. La risposta di Mr_Green sostituirà globalmente TUTTI, il "che non va bene
Kolob Canyon,

Risposte:


387

assumendo:

var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));

Questo dovrebbe fare il trucco ... (se il tuo obiettivo è sostituire tutte le doppie virgolette).

Ecco come funziona:

  • ['"]è una classe di caratteri, corrisponde a virgolette singole e doppie. puoi sostituirlo con "per abbinare solo virgolette doppie.
  • +: una o più virgolette, caratteri, come definito dalla precedente classe di caratteri (facoltativo)
  • g: la bandiera globale . Questo dice a JS di applicare la regex all'intera stringa. Se lo ometti, sostituirai solo un singolo carattere.

Se stai cercando di rimuovere le virgolette attorno a una determinata stringa (cioè in coppia), le cose diventano un po 'più complicate. Dovrai utilizzare le asserzioni lookaround:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed

Regex ha spiegato:

  • ": letterale, corrisponde a qualsiasi letterale "
  • (: inizia a catturare il gruppo. Qualsiasi cosa tra parentesi ( ()) verrà catturata e può essere utilizzata nel valore di sostituzione.
  • [^"]+: Classe di caratteri, corrisponde a tutti i caratteri, tranne "1 o più volte
  • (?="): asserzione lookahead positiva a larghezza zero (come non acquisita). La partita precedente sarà valida solo se è seguita da un valore "letterale
  • ): fine del gruppo di acquisizione, abbiamo catturato tutto tra la chiusura dell'apertura "
  • ": un altro letterale, cfr. voce di elenco uno

La sostituzione è '$1', questo è un riferimento indietro al primo gruppo acquisito, essere [^" ]+o tutto tra le doppie virgolette. Il modello corrisponde sia alle virgolette che a ciò che c'è tra loro, ma lo sostituisce solo con quello tra le virgolette, rimuovendole in tal modo.
Quello che fa è some "string with" quotes-> sostituisce "string with"con -> string with. Citazioni esaurite, lavoro fatto.

Se le virgolette saranno sempre all'inizio e alla fine della stringa, allora potresti usare questo:

str.replace(/^"(.+(?="$))"$/, '$1');

Con input remove "foo" delimiting ", l'output rimarrà invariato, ma cambierà la stringa di input in "remove "foo" delimiting quotes"e finirai remove "foo" delimiting quotescome output.

Spiegazione:

  • ^": corrisponde all'inizio della stringa ^e a ". Se la stringa non inizia con a ", qui l'espressione non riesce e nulla viene sostituito.
  • (.+(?="$)): abbina (e cattura) tutto, comprese le doppie virgolette una o più volte, a condizione che il lookahead positivo sia vero
  • (?="$): il lookahead positivo è molto simile a quello sopra, solo specifica che " deve essere la fine della stringa ( $=== end)
  • "$: corrisponde alla citazione finale, ma non la cattura

La sostituzione avviene nello stesso modo di prima: sostituiamo la corrispondenza (che include le virgolette di apertura e chiusura), con tutto ciò che era al loro interno.
Potresti aver notato che ho omesso il gflag (per BTW globale), poiché poiché stiamo elaborando l'intera stringa, questa espressione si applica solo una volta.
Una regex più semplice che fa praticamente la stessa cosa (ci sono differenze interne nel modo in cui la regex viene compilata / applicata) sarebbe:

someStr.replace(/^"(.+)"$/,'$1');

Come prima ^"e "$abbina le virgolette di delimitazione all'inizio e alla fine di una stringa e (.+)corrisponde a tutto quello che sta in mezzo e lo cattura. Ho provato questa regex, insieme a quella sopra (con affermazione lookahead) e, devo ammettere, con mia grande sorpresa ho trovato questa leggermente più lenta. La mia ipotesi sarebbe che l'asserzione lookaround provochi l'espressione precedente non appena il motore determina che non c'è nessun "alla fine della stringa. Ah bene, ma se questo è quello che vuoi / hai bisogno, per favore continua a leggere :

Tuttavia, in quest'ultimo caso, è molto più sicuro, più veloce, più gestibile e semplicemente meglio farlo:

if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
    console.log(str.substr(1,str.length -2));
}

Qui, sto controllando se il primo e l'ultimo carattere nella stringa sono virgolette doppie. Se lo sono, sto usando substrper tagliare quei primi e ultimi caratteri. Le stringhe sono indicizzate a zero, quindi l'ultimo carattere è il charAt(str.length -1). substrsi aspetta 2 argomenti, dove il primo è l'offset da cui inizia la sottostringa, il secondo è la sua lunghezza. Dal momento che non vogliamo l'ultimo carattere, più di quanto vogliamo il primo, quella lunghezza è str.length - 2. Facile Peazy.

Suggerimenti :

Maggiori informazioni sulle asserzioni lookaround possono essere trovate qui
Regex's sono molto utili (e divertenti IMO), all'inizio possono essere un po 'sconcertanti. Ecco alcuni dettagli e collegamenti a risorse in materia.
Se non ti senti molto a tuo agio con Regex's, ti consigliamo di utilizzare:

var noQuotes = someStr.split('"').join('');

Se ci sono molte virgolette nella stringa, questo potrebbe anche essere più veloce dell'uso di regex


1
@rid: ho modificato, esplodendo un po 'su ciò che fa l'espressione e su come personalizzarla
Elias Van Ootegem,

83
str = str.replace(/^"(.*)"$/, '$1');

Questa regexp rimuoverà le virgolette solo se sono il primo e l'ultimo carattere della stringa. f.ex:

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)

63

Se la stringa ha una virgoletta (o qualsiasi altro carattere singolo) all'inizio e alla fine che desideri rimuovere:

str = str.slice(1, -1);

slice ha molto meno sovraccarico di un'espressione regolare.


8
Perché i downvotes? '"I am here"'. Slice (1, -1) -> 'I am here'!
darrinm,

2
Sorpreso, questo è stato ridimensionato poiché è esattamente il tipo di operazione 'rapida' di cui hai bisogno se hai a che fare con letterali RDF (in N3, ad esempio, gli URI sono generalmente indicati come simili <uri>e letterali simili "literal"). Quindi ecco un voto. ;)
Mark Birbeck,

2
(Soprattutto perché la domanda originale dice che vogliono rimuovere le virgolette attorno a una stringa.)
Mark Birbeck

2
Questa dovrebbe essere la risposta accettata poiché fa esattamente ciò che è stato chiesto e lo fa in modo efficiente.
Pascal,

38

Se hai il controllo sui tuoi dati e sai che le doppie virgolette circondano la stringa (quindi non apparire all'interno della stringa) e la stringa è un numero intero ... dì con:

"20151212211647278"

o simile rimuove piacevolmente le virgolette circostanti

JSON.parse("20151212211647278");

Non è una risposta universale, per quanto agevole per esigenze di nicchia


Questo errore su FireFox con: SyntaxError: JSON.parse: carattere imprevisto alla riga 1 colonna 1 dei dati JSON
Ben Pretorius

no ... funziona perfettamente sull'attuale nuova versione di FireFox
Scott Stensland,

JSON.parse ( "{123123}"); questo spazzerà via la tua risposta
Abhijeet

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Rebooter dei sistemi il

1
ho ricevuto un errore SintassiError: token imprevisto <in JSON in posizione 0
Freddy Sidauruk

17

Se si desidera rimuovere solo le virgolette:

function stripquotes(a) {
    if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
        return a.substr(1, a.length-2);
    }
    return a;
}

Questo approccio non toccherà la stringa se non sembra "text in quotes".


2
Utilizzare a.charAt(x)se si desidera <supporto ECMA5 (f.ex IE7).
David Hellsing,

8

Se desideri rimuovere solo virgolette dall'inizio o dalla fine, usa la seguente espressione regolare:

'"Hello"'.replace(/(^"|"$)/g, '');

1
Nota che anche questo cambierebbe "fooe foo". Si potrebbe solo voler eliminare intere coppie di questi.
Kos,

Grazie per la nota, ho pensato che fosse un comportamento previsto, però.
Denis,

5

Per riaffermare il problema in un modo più semplice da esprimere come espressione regolare:

Ottieni la sottostringa di caratteri contenuta tra zero o una virgoletta doppia iniziale e zero o una virgoletta doppia finale.

Ecco la regexp che lo fa:

  var regexp = /^"?(.+?)"?$/;
  var newStr = str.replace(/^"?(.+?)"?$/,'$1');

Abbattere la regexp:

  • ^"? una partita avida per zero o una virgoletta doppia iniziale
  • "?$ una partita avida per zero o una doppia virgoletta finale
  • quei due fermalibri una cattura non avida di tutti gli altri personaggi (.+?), che conterrà il bersaglio come $1.

Ciò restituirà delimited "string" hereper:

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'

5

Una fodera per le persone pigre

var str = '"a string"';
str = str.replace(/^"|"$/g, '');

Questa è la risposta più appropriata. /"/gnon funzionerà per "My name is \"Jason\"".
Jason Liu,

questa risposta rimuove ogni citazione all'inizio e alla fine, il che non è buono in caso di " - is a quotestringa, quindi non è la stessa di circa
vladkras

2

Questo funziona ...

var string1 = "'foo'";
var string2 = '"bar"';

function removeFirstAndLastQuotes(str){
  var firstChar = str.charAt(0);
  var lastChar = str[str.length -1];
  //double quotes
  if(firstChar && lastChar === String.fromCharCode(34)){
    str = str.slice(1, -1);
  }
  //single quotes
  if(firstChar && lastChar === String.fromCharCode(39)){
    str = str.slice(1, -1);
  }
  return str;
}
console.log(removeFirstAndLastQuotes(string1));
console.log(removeFirstAndLastQuotes(string2));


il codice è sbagliato. Prova a inserire una stringa vuota, oppure prova 'foo"o semplicementefoo"
Pavel P

1
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

Questo potrebbe funzionare per te.


0

Se si desidera rimuovere tutte le virgolette doppie nella stringa, utilizzare

var str = '"some "quoted" string"';
console.log( str.replace(/"/g, '') );
// some quoted string

Altrimenti, vuoi rimuovere solo le virgolette attorno alla stringa, usa:

var str = '"some "quoted" string"';
console.log( clean = str.replace(/^"|"$/g, '') );
// some "quoted" string

0

Questo semplice codice funzionerà anche, per rimuovere ad esempio una virgoletta doppia da una stringa racchiusa tra virgolette doppie:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"(.+)"/g, '$1'));

0

Se stai cercando di rimuovere le doppie virgolette prova a seguire

  var Stringstr = "\"I am here\"";
  var mystring = String(Stringstr);
  mystring = mystring.substring(1, mystring.length - 1);
  alert(mystring);

0

questo codice è molto meglio per mostrare il numero nella casella di testo

$ (this) = [la tua casella di testo]

            var number = $(this).val();
            number = number.replace(/[',]+/g, '');
            number = number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            $(this).val(number); // "1,234,567,890"

-2

Prova a seguire regex per rimuovere le virgolette doppie dalla stringa.

    $string = "I am here";
    $string =~ tr/"//d;
    print $string;
    exit();

2
Vogliono una soluzione javascript!
Toto
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.