Припустимо:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
Це повинно зробити трюк ... (якщо ваша мета - замінити всі подвійні лапки).
Ось як це працює:
['"]
це клас символів, відповідає як одинарним, так і подвійним лапкам. ви можете замінити це, "
щоб відповідати лише подвійним лапкам.
+
: одна чи кілька лапок, символів, визначених попереднім чар-класом (необов'язково)
g
: глобальний прапор. Це вказує JS застосувати регулярний вираз до всього рядка. Якщо пропустити це, ви заміните лише одну таблицю.
Якщо ви намагаєтесь видалити лапки навколо заданого рядка (тобто в парах), речі стають трохи складнішими. Вам доведеться використовувати орієнтовні твердження:
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 пояснив:
"
: literal, відповідає будь-якому буквальному "
(
: почати захоплення групи. Все, що знаходиться між круглими дужками ( ()
), буде захоплено і може бути використане у значенні заміни.
[^"]+
: Клас символів відповідає всім знакам, крім "
1 або більше разів
(?=")
: нульова ширина (як у не зафіксованому) позитивне твердження підказки. Попередній матч буде дійсним лише в тому випадку, якщо за ним дотримується "
буквальний
)
: закінчення групи захоплення, ми захопили все, що знаходиться між закриттям відкриття "
"
: інший буквальний, cf пункт списку один
Заміна полягає в тому '$1'
, що це зворотне посилання на першу захоплену групу, що перебуває [^" ]+
, або все, що знаходиться між подвійними лапками. Шаблон відповідає як цитатам, так і тому, що між ними, але замінює його лише тим, що знаходиться між цитатами, тим самим ефективно видаляючи їх.
Що він робить some "string with" quotes
- це> замінює "string with"
на -> string with
. Пропали котирування, робота виконана.
Якщо лапки завжди будуть на початку та в кінці рядка, ви можете використовувати це:
str.replace(/^"(.+(?="$))"$/, '$1');
З введенням remove "foo" delimiting "
висновок залишиться незмінним, але змініть рядок введення на "remove "foo" delimiting quotes"
, і ви закінчитесь remove "foo" delimiting quotes
як вихід.
Пояснення:
^"
: відповідає початку рядка ^
та a "
. Якщо рядок не починається з а "
, вираз тут вже відмовляється, і нічого не замінюється.
(.+(?="$))
: відповідає (і фіксує) все, включаючи подвійні цитати один чи кілька разів, за умови, що позитивна позиція відповідає дійсності
(?="$)
: позитивний lookahead майже такий же, як і вище, лише він вказує, що "
повинен бути кінцем рядка ( $
=== кінець)
"$
: відповідає відповідній цитаті, але не захоплює її
Заміна проводиться так само, як і раніше: ми замінюємо матч (який включає котирування на відкриття та закриття), на все, що було всередині них.
Можливо, ви помітили, що я пропустив g
прапор (для глобальної BTW), оскільки оскільки ми обробляємо весь рядок, цей вираз застосовується лише один раз.
Більш легкий регулярний вираз, який робить, майже все, те саме (є внутрішня різниця в тому, як регекс складається і застосовується):
someStr.replace(/^"(.+)"$/,'$1');
Як ^"
і раніше, "$
співставляйте розмежувальні лапки на початку і в кінці рядка, а також (.+)
узгоджується все між ними і фіксує його. Я спробував цей регекс, поряд із вищевказаним (з твердженням lookahead), і, правда, на мій приріст виявив, що це трохи повільніше. Моя здогадка, що твердження про орієнтування спричиняє збій попереднього виразу, як тільки двигун визначить, що немає "
в кінці рядка. Ну добре, але якщо це те, що ти хочеш / потребуєш, будь ласка , читай далі :
Однак в останньому випадку це набагато безпечніше, швидше, більш рентабельне і просто краще це зробити:
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
Тут я перевіряю, чи є перша та остання знаки в рядку подвійними лапками. Якщо вони є, я використовую substr
для того, щоб вирізати ці перші та останні знаки. Рядки нульово індексуються, тому останній знак - це charAt(str.length -1)
. substr
очікує 2 аргументи, де перший - це зміщення, з якого починається підряд, другий - його довжина. Оскільки ми не хочемо останнього знака, більше, ніж ми хочемо першого, така довжина str.length - 2
. Легко-миловидна.
Поради :
Більше про орієнтовні твердження ви можете прочитати тут.
Regex дуже корисні (і ІМО весело), спочатку можуть бути трохи неприємними. Ось ще кілька деталей та посилання на ресурси з цього питання.
Якщо вам не дуже зручно користуватися регексом, ви можете подумати про використання:
var noQuotes = someStr.split('"').join('');
Якщо в рядку багато лапок, це може бути навіть швидше, ніж використання регулярного виразу