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 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 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 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):
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 substr
do odcięcia pierwszego i ostatniego znaku. Ciągi są indeksowane od zera, więc ostatnim znakiem jest charAt(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ść 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