Предполагая, что:
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
Регекс объяснил:
"
: буквальный, соответствует любому буквальному "
(
: начать захват группы. Все, что находится в скобках ( ()
), будет зафиксировано и может быть использовано в качестве значения замены.
[^"]+
: Класс персонажа, соответствует всем символам, кроме "
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 "
. Если строка не начинается с a "
, выражение уже завершается с ошибкой, и ничего не заменяется.
(.+(?="$))
: соответствует (и захватывает) все, включая двойные кавычки один или несколько раз, при условии, что положительный прогноз верен
(?="$)
: положительный взгляд во многом такой же, как и выше, только он указывает, что "
должен быть конец строки ( $
=== конец)
"$
: соответствует этой конечной кавычке, но не захватывает ее
Замена выполняется так же, как и раньше: мы заменяем совпадение (которое включает в себя открывающие и закрывающие кавычки) всем, что было внутри них.
Возможно, вы заметили, что я опустил g
флаг (для глобального BTW), потому что, поскольку мы обрабатываем всю строку, это выражение применяется только один раз.
Более простое регулярное выражение, которое в значительной степени делает то же самое (есть внутренняя разница в том, как регулярное выражение компилируется / применяется) было бы:
someStr.replace(/^"(.+)"$/,'$1');
Как и раньше , ^"
и "$
соответствовать котировки на разграничения , в начале и в конце строки, а (.+)
спичек все между ними, и захватывает его. Я попробовал это регулярное выражение рядом с приведенным выше (с предварительным утверждением) и, по общему признанию, к моему удивлению обнаружил, что это немного медленнее. Я полагаю, что косвенное утверждение приводит к сбою предыдущего выражения, как только движок определит, что "
в конце строки нет. Ах, хорошо, но если это то, что вы хотите / нужно, пожалуйста , прочитайте :
Однако в последнем случае гораздо безопаснее, быстрее, удобнее в обслуживании и просто лучше сделать это:
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
. Easy-peazy.
Советы :
Подробнее об альтернативных утверждениях можно найти здесь. Регулярные выражения
очень полезны (и IMO весело), поначалу могут быть немного озадачивающими. Вот еще некоторые подробности и ссылки на ресурсы по этому вопросу.
Если вы пока не очень удобны в использовании регулярных выражений, вы можете рассмотреть возможность использования:
var noQuotes = someStr.split('"').join('');
Если в строке много кавычек, это может быть даже быстрее, чем с помощью регулярных выражений