Chcę usunąć podwójne cudzysłowy z ciągu


239

Chcę usunąć cały ""ciąg.

np. jeśli String jest: "I am here"to chcę tylko wyprowadzać I am here.


4
Dlaczego nie użyjesz po prostu string.replace („”, „”)
Adarsh ​​Kumar

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

11
Czy chcesz usunąć WSZYSTKIE cytaty lub cudzysłowy?
Kos

36
stackoverflow.com/q/19155566/989121 . Czy zamierzasz zadać 255 pytań, raz dla każdej postaci ASCII?
georg

6
str = str.replace(/^"|"$/g, '');zastępuje cudzysłowy graniczne. Odpowiedź Mr_Greena globalnie zastąpi WSZYSTKO, "co nie jest dobre
Kanion Kolob

Odpowiedzi:


387

Zarozumiały:

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

To powinno załatwić sprawę ... (jeśli Twoim celem jest zastąpienie wszystkich podwójnych cudzysłowów).

Oto jak to działa:

  • ['"]jest klasą znaków, dopasowuje zarówno pojedyncze, jak i podwójne cudzysłowy. możesz to zastąpić, "aby dopasować tylko podwójne cudzysłowy.
  • +: jeden lub więcej cytatów, znaków, jak zdefiniowano w poprzedniej klasie znaków (opcjonalnie)
  • g: flaga globalna . Mówi to JS o zastosowaniu wyrażenia regularnego do całego łańcucha. Jeśli pominiesz to, zastąpisz tylko jeden znak.

Jeśli próbujesz usunąć cudzysłowy wokół danego ciągu (tj. Parami), sprawy stają się nieco trudniejsze. Będziesz musiał zastosować twierdzenia o obejrzeniu:

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 wyjaśnił:

  • ": literał, pasuje do dowolnego literału "
  • (: rozpocznij przechwytywanie grupy. Cokolwiek znajduje się między nawiasami ( ()), zostanie przechwycone i może być użyte jako wartość zastępcza.
  • [^"]+: Klasa postaci, pasuje do wszystkich znaków, z wyjątkiem "1 lub więcej razy
  • (?="): dodatnia asercja z wyprzedzeniem o zerowej szerokości (jak w przypadku niewychwytywania). Poprzednie dopasowanie będzie ważne tylko, jeśli nastąpi po nim "literał
  • ): koniec grupy przechwytywania, uchwyciliśmy wszystko pomiędzy zamknięciem otwarcia "
  • ": inny dosłowny, patrz pierwszy element listy

Zastąpienie polega na '$1'tym, że jest to odniesienie do pierwszej przechwyconej grupy, będącej [^" ]+lub występującej pomiędzy podwójnymi cudzysłowami. Wzorzec pasuje zarówno do cudzysłowów, jak i między nimi, ale zastępuje je tylko tym, co znajduje się między cudzysłowami, w ten sposób skutecznie je usuwając.
To, co robi to some "string with" quotes-> zastępuje "string with"się - - string with. Cytaty zniknęły, praca wykonana.

Jeśli cytaty zawsze będą na początku i na końcu łańcucha, możesz użyć tego:

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

Przy wejściu remove "foo" delimiting "dane wyjściowe pozostaną niezmienione, ale zmienią ciąg wejściowy na "remove "foo" delimiting quotes", a skończysz remove "foo" delimiting quotesjako wynik.

Wyjaśnienie:

  • ^": dopasowuje początek łańcucha ^i a ". Jeśli ciąg nie zaczyna się od a ", wyrażenie już tutaj zawodzi i nic nie jest zastępowane.
  • (.+(?="$)): dopasowuje (i przechwytuje) wszystko, łącznie z podwójnymi cudzysłowami jeden lub więcej razy, pod warunkiem, że pozytywne spojrzenie jest prawdziwe
  • (?="$): dodatni lookahead jest taki sam jak powyżej, tyle że określa, że " musi to być koniec ciągu ( $=== end)
  • "$: dopasowuje ten cytat kończący, ale go nie ujmuje

Zastąpienie odbywa się w taki sam sposób, jak poprzednio: zamieniamy dopasowanie (które obejmuje cytaty otwierające i zamykające) na wszystko, co było w nich.
Być może zauważyłeś, że pominąłem gflagę (dla globalnej BTW), ponieważ ponieważ przetwarzamy cały ciąg, to wyrażenie stosuje się tylko raz.
Prostszym wyrażeniem regularnym, które robi właściwie to samo (istnieją wewnętrzne różnice w sposobie kompilowania / stosowania wyrażenia regularnego):

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

Tak jak poprzednio ^"i "$dopasuj cudzysłowy na początku i na końcu łańcucha, a (.+)wszystko dopasuje i przechwyci. Próbowałem tego wyrażenia regularnego, oprócz powyższego (z asertywnym zapewnieniem) i, ku mojemu zaskoczeniu, stwierdziłem, że jest on nieco wolniejszy. Domyślam się, że to stwierdzenie powoduje, że poprzednie wyrażenie kończy się niepowodzeniem, gdy tylko silnik ustali, że nie ma go "na końcu łańcucha. No cóż, ale jeśli tego właśnie chcesz / potrzebujesz, przeczytaj dalej :

Jednak w tym ostatnim przypadku jest to znacznie bezpieczniejsze, szybsze, łatwiejsze w utrzymaniu i po prostu lepiej to zrobić:

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

Tutaj sprawdzam, czy pierwszy i ostatni znak w ciągu są podwójnymi cudzysłowami. Jeśli tak, używam substrdo odcięcia pierwszego i ostatniego znaku. Ciągi są indeksowane od zera, więc ostatnim znakiem jest charAt(str.length -1). substroczekuje 2 argumentów, gdzie pierwszy to przesunięcie, od którego zaczyna się podłańcuch, drugi to jego długość. Ponieważ nie chcemy ostatniego znaku, dłużej niż pierwszego, długość jest str.length - 2. Spokojnie.

Wskazówki :

Więcej na temat twierdzeń o obejrzeniu można znaleźć tutaj Regexy
są bardzo przydatne (i zabawa IMO), na początku mogą być nieco zaskakujące. Oto kilka szczegółów i linki do zasobów w tej sprawie.
Jeśli jeszcze nie czujesz się komfortowo, używając wyrażeń regularnych, możesz rozważyć użycie:

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

Jeśli w łańcuchu jest dużo cudzysłowów, może to być nawet szybsze niż użycie wyrażenia regularnego


1
@rid: Zredagowałem, omawiając nieco to, co robi wyrażenie i jak je dostosować
Elias Van Ootegem,

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

To wyrażenie regularne usunie cudzysłowy tylko wtedy, gdy będą to pierwsze i ostatnie znaki ciągu. F.ex:

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

63

Jeśli ciąg ma gwarantowaną jedną cytat (lub dowolny inny pojedynczy znak) na początku i na końcu, który chcesz usunąć:

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

slice ma o wiele mniej kosztów ogólnych niż wyrażenie regularne.


8
Dlaczego opinie negatywne? „Jestem tu”. Plasterek (1, -1) -> „Jestem tutaj”!
darrinm

2
Zaskoczone, że zostało to zanegowane, ponieważ jest to dokładnie taka „szybka” operacja, której potrzebujesz, jeśli masz do czynienia z literałami RDF (na przykład w N3, na przykład, identyfikatory URI są zwykle oznaczone jako <uri>i literały jak "literal"). Oto opinia. ;)
Mark Birbeck

2
(Szczególnie dlatego, że pierwotne pytanie mówi, że chcą usunąć cytaty wokół łańcucha).
Mark Birbeck

2
To powinna być zaakceptowana odpowiedź, ponieważ robi dokładnie to, o co pytano i robi to skutecznie.
Pascal

38

Jeśli masz kontrolę nad swoimi danymi i wiesz, że podwójne cudzysłowy otaczają ciąg (więc nie pojawiają się w ciągu), a ciąg jest liczbą całkowitą ... powiedz:

"20151212211647278"

lub podobnie to ładnie usuwa otaczające cytaty

JSON.parse("20151212211647278");

Nie jest to uniwersalna odpowiedź, ale zręczna dla niszowych potrzeb


To spowoduje błąd w FireFoxie z: SyntaxError: JSON.parse: nieoczekiwany znak w wierszu 1 kolumny 1 danych JSON
Ben Pretorius

no ... działa dobrze w przypadku aktualnego nowego wydania FireFox
Scott Stensland

JSON.parse („{123123}”); to zdmuchnie twoją odpowiedź
Abhijeet

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Ponowne uruchomienie systemów

1
dostałem błąd SyntaxError: Nieoczekiwany token <w JSON na pozycji 0
Freddy Sidauruk

16

Jeśli chcesz tylko usunąć cudzysłowy:

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

To podejście nie dotknie łańcucha, jeśli nie wygląda "text in quotes".


2
Użyj, a.charAt(x)jeśli chcesz <obsługa ECMA5 (np. IE7).
David Hellsing

8

Jeśli chcesz usunąć cudzysłowy tylko na początku lub na końcu, użyj następującego wyrażenia regularnego:

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

1
Zauważ, że to również zmieni "fooi foo". Można chcieć tylko upuścić całe ich pary.
Kos,

Dzięki za notatkę, myślałem jednak, że to oczekiwane zachowanie.
Denis

5

Aby odtworzyć problem w sposób łatwiejszy do wyrażenia jako wyrażenie regularne:

Uzyskaj podłańcuch znaków zawarty między zero lub jednym wiodącym podwójnym cudzysłowem a zero lub jednym końcowym podwójnym cudzysłowem.

Oto wyrażenie regularne, które to robi:

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

Podział wyrażenia regularnego:

  • ^"? chciwy mecz dla zera lub jednego wiodącego podwójnego cudzysłowu
  • "?$ zachłanne dopasowanie dla zero lub jednego końcowego cudzysłowu
  • ci dwaj zalecają niechciane ujęcie wszystkich innych postaci (.+?), które będą zawierać cel jako $1.

Zwróci to delimited "string" hereza:

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

5

Jeden liniowiec dla leniwych ludzi

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

To jest najbardziej odpowiednia odpowiedź. /"/gnie będzie działać "My name is \"Jason\"".
Jason Liu

ta odpowiedź usuwa każdy cytat na początku i na końcu, co nie jest dobre w przypadku " - is a quotełańcucha znaków, więc nie jest takie samo, jak w okolicy
vladkras,

2

To działa...

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


kod jest zły. Spróbuj wpisać pusty ciąg znaków 'foo"lub po prostufoo"
Pavel P

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

To może Ci pomóc.


0

Jeśli chcesz usunąć wszystkie podwójne cudzysłowy w ciągu, użyj

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

W przeciwnym razie chcesz usunąć tylko cudzysłowy wokół ciągu, użyj:

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

0

Ten prosty kod będzie również działał, aby na przykład usunąć podwójny cytat z ciągu otoczonego podwójnym cytatem:

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

0

Jeśli próbujesz usunąć podwójne cudzysłowy, spróbuj wykonać następujące czynności

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

0

ten kod jest znacznie lepszy dla numeru pokazu w polu tekstowym

$ (this) = [twoje pole tekstowe]

            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

Spróbuj wykonać wyrażenie regularne, aby usunąć podwójne cudzysłowy z łańcucha.

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

2
Chcą rozwiązania javascript!
Toto
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.