Я хочу видалити подвійні лапки з рядка


239

Я хочу видалити ""навколо рядка.

наприклад, якщо String є: "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?
georg

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

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

Якщо в рядку багато лапок, це може бути навіть швидше, ніж використання регулярного виразу


1
@rid: Я відредагував, трохи розширивши те, що робить вираз, і як його налаштувати
Elias Van Ootegem

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
Чому голоси? "" Я тут "". Фрагмент (1, -1) -> "Я тут"!
darrinm

2
Здивовано, що це спростовано, оскільки це саме той тип "швидкої" операції, який вам потрібен, якщо ви маєте справу з літераторами RDF (наприклад, у N3, URI зазвичай позначаються як <uri>і літерали як "literal"). Тож ось виступ. ;)
Марк Бірбек

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

2
Це має бути прийнятою відповіддю, оскільки вона робить саме те, що було запропоновано, і робить це ефективно.
Паскаль

38

Якщо у вас є контроль над своїми даними, і ви знаєте, що подвійні лапки оточують рядок (тому не відображаються всередині рядка), а рядок є цілим числом ... скажіть:

"20151212211647278"

чи подібне це добре видаляє навколишні цитати

JSON.parse("20151212211647278");

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


Це стане помилкою у FireFox за допомогою: SyntaxError: JSON.parse: несподіваний символ у рядку 1, стовпець 1 даних JSON
Бен Преторіус,

ні ... працює чудово на поточному свіжому випуску FireFox
Scott Stensland

JSON.parse ("{123123}"); це підірве вашу відповідь
Abhijeet

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
System Rebooter

1
у мене з’явилася помилка SyntaxError: Несподіваний маркер <в JSON в позиції 0
Фредді Сидаурук

16

Якщо ви хочете видалити лише граничні лапки:

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 (f.ex 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"
Павло П

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

цей код дуже кращий для показу номера в текстовому полі

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

            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.