Ich möchte doppelte Anführungszeichen aus einem String entfernen


238

Ich möchte das ""um einen String entfernen .

zB wenn der String ist: "I am here"dann möchte ich nur ausgeben I am here.


4
Warum benutzt du nicht einfach string.replace ('"', '')
Adarsh ​​Kumar

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

11
Möchten Sie ALLE Anführungszeichen oder Grenzzitate entfernen?
Kos

36
stackoverflow.com/q/19155566/989121 . Werden Sie 255 Fragen stellen, einmal für jedes ASCII-Zeichen?
Georg

6
str = str.replace(/^"|"$/g, '');ersetzt Grenzzitate. Mr_Greens Antwort wird global ALLE ersetzen, "was nicht gut ist
Kolob Canyon

Antworten:


387

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 quotesAusgabe.

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 gFlag 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). substrerwartet 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


1
@rid: Ich habe bearbeitet, ein wenig erklärt, was der Ausdruck tut und wie man ihn
anpasst

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

Dieser reguläre Ausdruck entfernt die Anführungszeichen nur, wenn es sich um das erste und das letzte Zeichen der Zeichenfolge handelt. F.ex.:

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

63

Wenn die Zeichenfolge am Anfang und am Ende garantiert ein Anführungszeichen (oder ein anderes einzelnes Zeichen) enthält, das Sie entfernen möchten:

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

slice hat viel weniger Overhead als ein regulärer Ausdruck.


8
Warum die Abstimmungen? '"Ich bin hier"'. Slice (1, -1) -> 'Ich bin hier'!
Darrinm

2
Überrascht, dass dies abgelehnt wurde, da es genau die Art von "schneller" Operation ist, die Sie benötigen, wenn Sie mit RDF-Literalen arbeiten (in N3 werden URIs beispielsweise normalerweise als " <uri>und Literale als" bezeichnet "literal"). Also hier ist eine Gegenstimme. ;)
Mark Birbeck

2
(Vor allem, weil die ursprüngliche Frage besagt, dass sie die Anführungszeichen um eine Zeichenfolge entfernen möchten .)
Mark Birbeck

2
Dies sollte die akzeptierte Antwort sein, da es genau das tut, was gefragt wurde, und es effizient macht.
Pascal

38

Wenn Sie die Kontrolle über Ihre Daten haben und wissen, dass Ihre doppelten Anführungszeichen die Zeichenfolge umgeben (also nicht in der Zeichenfolge erscheinen) und die Zeichenfolge eine Ganzzahl ist ... sagen Sie mit:

"20151212211647278"

oder ähnlich entfernt dies schön die umgebenden Anführungszeichen

JSON.parse("20151212211647278");

Keine universelle Antwort, jedoch für Nischenbedürfnisse geeignet


Dies wird Fehler in FireFox mit: SyntaxError: JSON.parse: unerwartetes Zeichen in Zeile 1 Spalte 1 der JSON-Daten
Ben Pretorius

nein ... funktioniert gut mit der aktuellen Neuveröffentlichung von FireFox
Scott Stensland

JSON.parse ("{123123}"); Dies wird Ihre Antwort wegblasen
Abhijeet

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

1
Ich habe einen Fehler SyntaxError: Unerwartetes Token <in JSON an Position 0
Freddy Sidauruk

16

Wenn Sie nur die Anführungszeichen entfernen möchten:

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

Dieser Ansatz berührt die Zeichenfolge nicht, wenn sie nicht so aussieht "text in quotes".


2
Verwenden a.charAt(x)Sie diese Option, wenn Sie <ECMA5-Unterstützung wünschen (z. B. IE7).
David Hellsing

8

Wenn Sie nur Anführungszeichen am Anfang oder am Ende entfernen möchten, verwenden Sie den folgenden regulären Ausdruck:

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

1
Beachten Sie, dass dies auch "foound ändern würde foo". Man möchte vielleicht nur ganze Paare davon fallen lassen.
Kos

Vielen Dank für den Hinweis, ich dachte, es sei ein erwartetes Verhalten.
Denis

5

So formulieren Sie Ihr Problem auf eine Weise, die sich leichter als regulärer Ausdruck ausdrücken lässt:

Ruft die Teilzeichenfolge von Zeichen ab, die zwischen null oder einem führenden doppelten Anführungszeichen und null oder einem nachfolgenden doppelten Anführungszeichen enthalten ist.

Hier ist der reguläre Ausdruck, der das tut:

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

Den regulären Ausdruck aufschlüsseln:

  • ^"? eine gierige Übereinstimmung für null oder eine führende doppelte Anführungszeichen
  • "?$ eine gierige Übereinstimmung für null oder eine nachfolgende doppelte Anführungszeichen
  • Diese beiden Buchstützen zeigen eine nicht gierige Erfassung aller anderen Charaktere (.+?), die das Ziel als enthalten $1.

Dies wird zurückkehren delimited "string" herefür:

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

5

Ein Einzeiler für die Faulen

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

Dies ist die am besten geeignete Antwort. /"/gwird nicht funktionieren für "My name is \"Jason\"".
Jason Liu

Diese Antwort entfernt jedes Zitat am Anfang und am Ende, was im Falle einer " - is a quoteZeichenfolge nicht gut ist , also ist es nicht dasselbe wie um
vladkras

2

Das funktioniert...

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));


Code ist falsch. Versuchen Sie es mit einer leeren Zeichenfolge oder versuchen Sie es 'foo"oder einfachfoo"
Pavel P

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

Dies kann für Sie funktionieren.


0

Wenn Sie alle doppelten Anführungszeichen in Zeichenfolgen entfernen möchten, verwenden Sie

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

Andernfalls möchten Sie nur Anführungszeichen um die Zeichenfolge entfernen. Verwenden Sie:

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

0

Dieser einfache Code funktioniert auch, um beispielsweise doppelte Anführungszeichen aus einer Zeichenfolge zu entfernen, die von doppelten Anführungszeichen umgeben ist:

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

0

Wenn Sie versuchen, die doppelten Anführungszeichen zu entfernen, versuchen Sie Folgendes

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

0

Dieser Code ist sehr gut für die Show-Nummer im Textfeld

$ (this) = [dein Textfeld]

            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

Bitte versuchen Sie, dem regulären Ausdruck zu folgen, um doppelte Anführungszeichen aus der Zeichenfolge zu entfernen.

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

2
Sie wollen eine Javascript-Lösung!
Toto
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.