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 quotes
come 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 g
flag (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 substr
per tagliare quei primi e ultimi caratteri. Le stringhe sono indicizzate a zero, quindi l'ultimo carattere è il charAt(str.length -1)
. substr
si 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