Как поменять кавычку внутри слова, не меняя другие кавычки в тексте

172
07 марта 2019, 06:40

Нужно сделать регулярными выражениями. Как написать шаблон для замены кавычек c " на ' - только тех которые находятся внутри слов?

var text = 'Эту "задачу" "нужн"о сделать" регулярным"и выраже"ниями';
var pattern = '/???/';
var result = text.replace(pattern, "'");
console.log(result);
Answer 1

Так как кавычка внутри слова, слева и справа от нее должны быть буквы.

Поэтому для русского языка регулярка может иметь вид /([а-яё])"([а-яё])/g.

Шаблон замены: "$1'$2" → взять первую и вторую группы (буквы между которыми была кавычка) и поставить между ними одинарную кавычку:

var text = 'Эту "задачу" "нужн"о сделать" регулярным"и выраже"ниями'; 
var pattern = /([а-яё])"([а-яё])/g; 
var result = text.replace(pattern, "$1'$2"); 
console.log(result);

Answer 2

Решение, которое будет работать во всех браузерах, не должно содержать блока предварительного просмотра назад. Кроме того, чтобы заменить кавычки, которые следуют друг за другом через одну букву, без блока предварительного просмотра вперёд не обойтись.

Поэтому лучшее решение будет

var text = 'Эту "задачу" "ну"ж"н"о сделать" регулярным"и выраже"ниями'; 
var pattern = /([а-яё])"(?=[а-яё])/ig; 
var result = text.replace(pattern, "$1'"); 
console.log(result);

См. демо регулярного выражения.

Подробности

  • ([а-яё]) - Захватывающая группа №1 (ссылка на значение этой группы из шаблона замены осуществляется с помощью $1): буква русского алфавита
  • " - двойная кавычка
  • (?=[а-яё]) - блок предварительного просмотра вперёд, который проверяет следующее условие: сразу после знака " должна стоять буква русского алфавита
  • ig - модификаторы
    • i - регистронезависимость включена
    • g - поиск всех вхождений включен

Для браузеров и сред, поддерживающих стандарт ECMAScript 2018, можно использовать следующее решение для любого языка:

var pattern = /(?<=\p{L})"(?=\p{L})/gu; 
var result = 'Эту "задачу" "ну"ж"н"о сделать" регулярным"и выраже"ниями'.replace(pattern, "'"); 
console.log(result);

\p{L} находит любую букву.

Answer 3

var text = 'Эту "задачу" "нужн"о сделать" регулярным"и выраже"ниями'; 
var result = text.replace(/(?<=\S)\"(?=\S)/g, "\'"); 
 
console.log(result);

READ ALSO
Leaflet растягивающийся маркер с текстом

Leaflet растягивающийся маркер с текстом

Использую Leaflet плагин extra-markers Если добавить marker с описанием icon:

196
Перевести код с использованием классов

Перевести код с использованием классов

Помогите переделать этот код с использованием классов и конструкторов для инициализации объектов классов

174
Почему не работает await в данном случае?

Почему не работает await в данном случае?

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

222
Собрать данные из формы в data

Собрать данные из формы в data

Начинаю изучать vue, возник вопрос, как данные из input введенные пользователем записать в массив namesThatRhyme, в виде value:введенные данные , тк сейчас...

162