it-swarm.com.de

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

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

z.B. Wenn der String "I am here" ist, möchte ich nur I am here ausgeben.

198
ankur

Vorausgesetzt:

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

Das sollte den Trick machen ... (wenn es Ihr Ziel ist, alle doppelte Anführungszeichen zu ersetzen).

So funktioniert das:

  • ['"] ist eine Zeichenklasse, die sowohl mit einfachen als auch mit doppelten Anführungszeichen übereinstimmt. 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: das global Flag. 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, werden die Dinge etwas schwieriger. Sie müssen Lookaround-Aussagen 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, entspricht jedem Literal "
  • (: Mit der Erfassung der Gruppe beginnen. Was immer zwischen den Klammern steht (()), wird erfasst und kann als Ersatzwert verwendet werden.
  • [^"]+: Zeichenklasse, entspricht alle Zeichen, außer " 1 oder mehrmals
  • (?="): positive Lookahead-Behauptung mit der Breite Null (wie in nicht erfasst). Die vorherige Übereinstimmung ist nur gültig, wenn darauf ein "-Literal folgt
  • ): Gruppe beenden, wir haben alles zwischen dem Öffnen und Schließen erfasst. "
  • ": Ein weiteres Literal, siehe Listenelement eins

Die Ersetzung ist '$1', dies ist eine Rückreferenz auf die erste erfasste Gruppe, die [^" ]+ ist oder zwischen den Anführungszeichen steht. Das Muster stimmt sowohl mit den Anführungszeichen als auch mit dem Inhalt überein, ersetzt es jedoch nur durch den Inhalt zwischen den Anführungszeichen und entfernt sie so effektiv.
Was es tut, ist some "string with" quotes -> ersetzt "string with" durch -> string with. Zitate weg, Arbeit erledigt.

Wenn die Anführungszeichen immer am Anfang und Ende der Zeichenfolge stehen, können Sie Folgendes verwenden:

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

Bei Eingabe von remove "foo" delimiting " bleibt die Ausgabe unverändert, aber ändern Sie die Eingabezeichenfolge in "remove "foo" delimiting quotes", und Sie erhalten remove "foo" delimiting quotes als Ausgabe.

Erläuterung:

  • ^": Entspricht dem Anfang der Zeichenfolge ^ und einem ". Wenn die Zeichenfolge nicht mit einem " beginnt, schlägt der Ausdruck hier bereits fehl und es wird nichts ersetzt.
  • (.+(?="$)): Stimmt mit allem überein (und erfasst alles), einschließlich doppelter Anführungszeichen, sofern der positive Lookahead wahr ist
  • (?="$): Der positive Lookahead ist im Großen und Ganzen derselbe wie oben, nur dass der "muss das Ende der Zeichenfolge sein ($ === end)
  • "$: stimmt mit dem Endzitat überein, erfasst es jedoch nicht

Der Austausch erfolgt auf die gleiche Weise wie zuvor: Wir ersetzen das Match (einschließlich der Eröffnungs- und Schluss-Anführungszeichen) durch alles, was sich in ihm befand.
Sie haben vielleicht bemerkt, dass ich das g -Flag weggelassen habe (für globales BTW), da wir den gesamten String verarbeiten, gilt dieser Ausdruck nur einmal.
Ein einfacher regulärer Ausdruck, der im Wesentlichen dasselbe tut (es gibt interne Unterschiede bei der Kompilierung/Anwendung des regulären Ausdrucks), wäre:

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

Wie zuvor stimmen ^" und "$ mit den abgrenzenden Anführungszeichen am Anfang und Ende einer Zeichenfolge überein, und der (.+) stimmt mit allem dazwischen überein und erfasst es. Ich habe diesen regulären Ausdruck neben dem obigen (mit Lookahead-Behauptung) ausprobiert und, zugegebenermaßen, zu meiner Überraschung, festgestellt, dass dieser etwas langsamer ist. Ich vermute, dass die Lookaround-Assertion dazu führt, dass der vorherige Ausdruck fehlschlägt, sobald die Engine feststellt, dass sich am Ende der Zeichenfolge kein " befindet. Ah gut, aber wenn es das ist, was du willst/brauchst, bitte lies weiter:

In diesem letzten Fall ist es jedoch weitaus sicherer, schneller, wartungsfreundlicher und 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, verwende ich substr, um abgeschnitten diese ersten und letzten Zeichen. Zeichenfolgen sind mit einem Index von Null versehen, sodass das letzte Zeichen das Zeichen charAt(str.length -1) ist. substr erwartet 2 Argumente, wobei das erste der Offset ist, ab dem die Teilzeichenfolge beginnt, das zweite die Länge. Da wir nicht mehr das letzte Zeichen wollen als das erste, ist diese Länge str.length - 2. Easy-Peazy.

Tips:

Mehr zu Behauptungen zur Fehlerumgehung hier zu finden
Regex sind sehr nützlich (und IMO-Spaß), können zunächst etwas verwirrend sein. Hier sind einige weitere Details und Links zu Ressourcen zu diesem Thema.
Wenn Sie noch nicht besonders gut mit regulären Ausdrücken umgehen können, 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

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

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

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)
67
David Hellsing

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.

40
darrinm

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

"20151212211647278"

o.ä. entfernt dies die umgebenden Anführungszeichen

JSON.parse("20151212211647278");

Keine universelle Antwort, auch wenn sie für Nischenbedürfnisse geeignet ist

31
Scott Stensland

Wenn Sie nur die Grenzzitate 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 er nicht wie "text in quotes" aussieht.

12
Kos

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

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

Um Ihr Problem auf eine Weise zu wiederholen, die einfacher als regulärer Ausdruck auszudrücken ist:

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

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

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

Aufschlüsselung des regulären Ausdrucks:

  • ^"? eine gierige Übereinstimmung für null oder eins führende doppelte Anführungszeichen
  • "?$ eine gierige Übereinstimmung für null oder eins doppelte Anführungszeichen
  • diese beiden bookend eine nicht gierige Erfassung aller anderen Zeichen, (.+?), die das Ziel als $1 enthalten wird.

Dies gibt delimited "string" here zurück für:

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

Ein Einzeiler für die Faulen

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

Wenn Sie alle Anführungszeichen in einer Zeichenfolge 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
1
balkon_smoke

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
Amaynut

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));
0
Ron Royston
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

Dies kann für Sie arbeiten.

0
Splinker P