Chcę usunąć cały ""
ciąg.
np. jeśli String jest: "I am here"
to chcę tylko wyprowadzać I am here
.
javascript
regex
ankur
źródło
źródło
str = str.replace(/"/g,"");
str = str.replace(/^"|"$/g, '');
zastępuje cudzysłowy graniczne. Odpowiedź Mr_Greena globalnie zastąpi WSZYSTKO,"
co nie jest dobreOdpowiedzi:
Zarozumiały:
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:
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 listyZastą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:
Przy wejściu
remove "foo" delimiting "
dane wyjściowe pozostaną niezmienione, ale zmienią ciąg wejściowy na"remove "foo" delimiting quotes"
, a skończyszremove "foo" delimiting quotes
jako 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 ujmujeZastą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
g
flagę (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):
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ć:
Tutaj sprawdzam, czy pierwszy i ostatni znak w ciągu są podwójnymi cudzysłowami. Jeśli tak, używam
substr
do odcięcia pierwszego i ostatniego znaku. Ciągi są indeksowane od zera, więc ostatnim znakiem jestcharAt(str.length -1)
.substr
oczekuje 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ść jeststr.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:
Jeśli w łańcuchu jest dużo cudzysłowów, może to być nawet szybsze niż użycie wyrażenia regularnego
źródło
To wyrażenie regularne usunie cudzysłowy tylko wtedy, gdy będą to pierwsze i ostatnie znaki ciągu. F.ex:
źródło
Jeśli ciąg ma gwarantowaną jedną cytat (lub dowolny inny pojedynczy znak) na początku i na końcu, który chcesz usunąć:
slice
ma o wiele mniej kosztów ogólnych niż wyrażenie regularne.źródło
<uri>
i literały jak"literal"
). Oto opinia. ;)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:
lub podobnie to ładnie usuwa otaczające cytaty
Nie jest to uniwersalna odpowiedź, ale zręczna dla niszowych potrzeb
źródło
JSON.parse("20151212211647278dfvs");
SyntaxError: Unexpected token d in JSON at position 17
Jeśli chcesz tylko usunąć cudzysłowy:
To podejście nie dotknie łańcucha, jeśli nie wygląda
"text in quotes"
.źródło
a.charAt(x)
jeśli chcesz <obsługa ECMA5 (np. IE7).Jeśli chcesz usunąć cudzysłowy tylko na początku lub na końcu, użyj następującego wyrażenia regularnego:
źródło
"foo
ifoo"
. Można chcieć tylko upuścić całe ich pary.Aby odtworzyć problem w sposób łatwiejszy do wyrażenia jako wyrażenie regularne:
Oto wyrażenie regularne, które to robi:
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(.+?)
, które będą zawierać cel jako$1
.Zwróci to
delimited "string" here
za:źródło
Jeden liniowiec dla leniwych ludzi
źródło
/"/g
nie będzie działać"My name is \"Jason\""
." - is a quote
łańcucha znaków, więc nie jest takie samo, jak w okolicyTo działa...
źródło
'foo"
lub po prostufoo"
To może Ci pomóc.
źródło
Jeśli chcesz usunąć wszystkie podwójne cudzysłowy w ciągu, użyj
W przeciwnym razie chcesz usunąć tylko cudzysłowy wokół ciągu, użyj:
źródło
Ten prosty kod będzie również działał, aby na przykład usunąć podwójny cytat z ciągu otoczonego podwójnym cytatem:
źródło
Jeśli próbujesz usunąć podwójne cudzysłowy, spróbuj wykonać następujące czynności
źródło
ten kod jest znacznie lepszy dla numeru pokazu w polu tekstowym
$ (this) = [twoje pole tekstowe]
źródło
Spróbuj wykonać wyrażenie regularne, aby usunąć podwójne cudzysłowy z łańcucha.
źródło