Я хочу удалить двойные кавычки из строки


239

Я хочу удалить ""вокруг строки.

например, если строка: "I am here"то я хочу выводить только I am here.


4
Почему бы вам просто не использовать string.replace ('"', '')
Adarsh ​​Kumar

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

11
Вы хотите удалить ВСЕ цитаты или граничные цитаты?
Кос

36
stackoverflow.com/q/19155566/989121 . Собираетесь ли вы задать 255 вопросов, по одному разу для каждого персонажа ASCII?
Георг

6
str = str.replace(/^"|"$/g, '');заменяет граничные кавычки. Ответ Mr_Green повсеместно заменит ВСЕ, "что не годится
Колоб Каньон,

Ответы:


387

Предполагая, что:

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

Если в строке много кавычек, это может быть даже быстрее, чем с помощью регулярных выражений


1
@rid: я отредактировал, немного объяснив, что делает выражение и как его настроить
Элиас Ван Оотегем,

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

Это регулярное выражение удалит кавычки, только если они являются первым и последним символом строки. f.ex:

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

63

Если строка имеет гарантированно одну кавычку (или любой другой одиночный символ) в начале и конце, которую вы хотите удалить:

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

slice имеет гораздо меньше накладных расходов, чем регулярное выражение.


8
Почему отрицательные? «Я здесь». Slice (1, -1) -> «Я здесь»!
Дарринм

2
Удивило, что это было отвергнуто, поскольку это именно та «быстрая» операция, которая вам нужна, если вы имеете дело с литералами RDF (например, в N3 URI обычно обозначаются как <uri>и литералы как "literal"). Итак, вот голос против. ;)
Марк Бирбек

2
(Особенно потому, что в первоначальном вопросе говорится, что они хотят удалить кавычки вокруг строки.)
Марк Бирбек,

2
Это должен быть принятый ответ, поскольку он делает именно то, что было задано, и делает это эффективно.
Паскаль

38

Если у вас есть контроль над вашими данными, и вы знаете, что двойные кавычки окружают строку (поэтому не отображаются внутри строки), и строка является целым числом ... скажем с:

"20151212211647278"

или подобное это приятно удаляет окружающие цитаты

JSON.parse("20151212211647278");

Не универсальный ответ, однако приятный для нишевых потребностей


Это приведет к ошибке в FireFox с: SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 1 данных JSON
Бен Преториус

нет ... отлично работает на текущем свежем выпуске FireFox
Скотт Стенсланд

JSON.parse ( "{123123}"); это будет сдувать ваш ответ
Abhijeet

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Перезагрузка системы

1
я получил ошибку SyntaxError: неожиданный токен <в JSON в позиции 0
Фредди Сидаурук

17

Если вы хотите удалить только граничные кавычки:

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

Этот подход не затронет строку, если не будет выглядеть "text in quotes".


2
Используйте, a.charAt(x)если хотите <поддержку ECMA5 (например, IE7).
Дэвид Хеллсинг

8

Если вы хотите удалить кавычки только в начале или в конце, используйте следующее регулярное выражение:

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

1
Обратите внимание, что это также изменит "fooи foo". Можно только хотеть отбросить целые пары из них.
Кос

Спасибо за примечание, я думал, что это было ожидаемое поведение, хотя.
Денис

5

Чтобы сформулировать вашу проблему так, чтобы ее было проще выразить в виде регулярного выражения:

Получить подстроку символов, содержащуюся между нулем или одной двойной кавычкой и нулевой или одной двойной кавычкой.

Вот регулярное выражение, которое делает это:

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

Разбиваем регулярное выражение:

  • ^"? жадное совпадение для нуля или одной ведущей двойной кавычки
  • "?$ жадное совпадение для нуля или одного двойного кавычки
  • эти двое оскверняют нежадный захват всех остальных персонажей (.+?), который будет содержать цель как $1.

Это вернется delimited "string" hereза:

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

5

Один лайнер для ленивых людей

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

Это самый подходящий ответ. /"/gне будет работать "My name is \"Jason\"".
Джейсон Лю

этот ответ удаляет каждую цитату в начале и в конце, что не очень хорошо в случае " - is a quoteстроки, поэтому это не то же самое, что и вокруг
vladkras

2

Это работает...

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


код неверный. Попробуйте ввести пустую строку или попробуйте 'foo"или простоfoo"
Pavel P

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

Это может работать для вас.


0

Если вы хотите удалить все двойные кавычки в строке, используйте

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

В противном случае вы хотите удалить только кавычки вокруг строки, используйте:

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

0

Этот простой код также будет работать, например, для удаления двойной кавычки из строки, заключенной в двойную кавычку:

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

0

Если вы пытаетесь удалить двойные кавычки, попробуйте следующее

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

0

этот код очень удобен для показа номера в текстовом поле

$ (this) = [ваше текстовое поле]

            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

Пожалуйста, попробуйте следующее регулярное выражение для удаления двойных кавычек из строки.

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

2
Они хотят решения javascript!
Тото
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.