Angenommen:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
Das sollte den Trick machen ... (wenn Ihr Ziel darin besteht, alle doppelten Anführungszeichen zu ersetzen ).
So funktioniert das:
['"]
ist eine Zeichenklasse, die sowohl einfache als auch doppelte Anführungszeichen enthält. Sie können dies durch ersetzen, "
um nur doppelte Anführungszeichen zu erhalten.
+
: ein oder mehrere Anführungszeichen, Zeichen, wie in der vorhergehenden Zeichenklasse definiert (optional)
g
: die globale Flagge. Dies weist JS an, den regulären Ausdruck auf die gesamte Zeichenfolge anzuwenden. Wenn Sie dies weglassen, ersetzen Sie nur ein einzelnes Zeichen.
Wenn Sie versuchen, die Anführungszeichen um eine bestimmte Zeichenfolge (dh paarweise) zu entfernen, wird es etwas schwieriger. Sie müssen Lookaround-Assertions verwenden:
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 erklärte:
"
: Literal, passt zu jedem Literal "
(
: Beginnen Sie mit der Erfassung der Gruppe. Was auch immer zwischen den Klammern ( ()
) steht, wird erfasst und kann im Ersatzwert verwendet werden.
[^"]+
: Zeichenklasse, entspricht allen Zeichen, außer "
1 oder mehr Mal
(?=")
: Positive Lookahead-Behauptung mit einer Breite von Null (wie in nicht erfasst). Die vorherige Übereinstimmung ist nur gültig, wenn ein "
Literal folgt
)
: Ende der Erfassungsgruppe, wir haben alles zwischen dem Eröffnungsschluss erfasst "
"
: ein anderes Literal, siehe Listenpunkt eins
Die Ersetzung ist '$1'
, dass dies ein Rückverweis auf die erste erfasste Gruppe ist [^" ]+
, die zwischen den doppelten Anführungszeichen steht oder steht. Das Muster stimmt sowohl mit den Anführungszeichen als auch mit den dazwischen liegenden Anführungszeichen überein, ersetzt es jedoch nur durch die Anführungszeichen zwischen den Anführungszeichen, wodurch sie effektiv entfernt werden.
Was es tut, ist some "string with" quotes
-> ersetzt "string with"
durch -> string with
. Zitate weg, Arbeit erledigt.
Wenn sich die Anführungszeichen immer am Anfang und am Ende der Zeichenfolge befinden, können Sie Folgendes verwenden:
str.replace(/^"(.+(?="$))"$/, '$1');
Bei der Eingabe remove "foo" delimiting "
bleibt die Ausgabe unverändert, aber ändern Sie die Eingabezeichenfolge in "remove "foo" delimiting quotes"
, und Sie erhalten die remove "foo" delimiting quotes
Ausgabe.
Erläuterung:
^"
: Entspricht dem Anfang der Zeichenfolge ^
und a "
. Wenn die Zeichenfolge nicht mit a beginnt "
, schlägt der Ausdruck hier bereits fehl und nichts wird ersetzt.
(.+(?="$))
: Stimmt alles überein (und erfasst) alles, einschließlich doppelter Anführungszeichen ein- oder mehrmals, vorausgesetzt, der positive Lookahead ist wahr
(?="$)
: Der positive Vorgriff - wesentlich die gleiche wie oben ist, nur gibt es , dass die "
muß das Ende der Zeichenfolge sein ( $
=== end)
"$
: Entspricht diesem Endzitat, erfasst es jedoch nicht
Das Ersetzen erfolgt auf die gleiche Weise wie zuvor: Wir ersetzen das Match (einschließlich der Eröffnungs- und Schlusszitate) durch alles, was sich in ihnen befand.
Möglicherweise haben Sie bemerkt, dass ich das g
Flag weggelassen habe (für globales BTW), da dieser Ausdruck nur einmal gilt, da wir die gesamte Zeichenfolge verarbeiten.
Ein einfacher Regex, der so ziemlich dasselbe tut (es gibt interne Unterschiede bei der Kompilierung / Anwendung des Regex), wäre:
someStr.replace(/^"(.+)"$/,'$1');
Wie zuvor ^"
und "$
stimmen Sie mit den abgrenzenden Anführungszeichen am Anfang und Ende eines Strings (.+)
überein , und das stimmt mit allem dazwischen überein und erfasst es. Ich habe diesen regulären Ausdruck neben dem obigen ausprobiert (mit Lookahead-Behauptung) und zu meiner Überraschung zugegebenermaßen festgestellt, dass dieser etwas langsamer ist. Meine Vermutung wäre, dass die Lookaround-Zusicherung dazu führt, dass der vorherige Ausdruck fehlschlägt, sobald die Engine feststellt, dass "
am Ende der Zeichenfolge keine steht. Na ja , aber wenn Sie dies wollen / brauchen, lesen Sie bitte weiter :
In diesem letzten Fall ist es jedoch weitaus sicherer, schneller, wartbarer und einfach besser, dies zu tun:
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
Hier überprüfe ich, ob das erste und das letzte Zeichen in der Zeichenfolge doppelte Anführungszeichen sind. Wenn ja substr
, schneide ich die ersten und letzten Zeichen ab. Strings sind nullindiziert, daher ist das letzte Zeichen das charAt(str.length -1)
. substr
erwartet 2 Argumente, wobei das erste der Versatz ist, von dem aus die Teilzeichenfolge beginnt, das zweite die Länge. Da wir das letzte Zeichen nicht mehr wollen als das erste, ist diese Länge str.length - 2
. Einfach peazy.
Tipps :
Weitere Informationen zu Lookaround-Behauptungen finden Sie hier.
Regex's sind sehr nützlich (und machen IMO-Spaß) und können zunächst etwas verwirrend sein. Hier finden Sie weitere Details und Links zu Ressourcen zu diesem Thema.
Wenn Sie mit Regex noch nicht sehr vertraut sind, sollten Sie Folgendes in Betracht ziehen:
var noQuotes = someStr.split('"').join('');
Wenn die Zeichenfolge viele Anführungszeichen enthält, ist dies möglicherweise sogar schneller als die Verwendung von Regex