@victor-ponamariov

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

Как можно на JavaScript заменить в строке кавычки "" на «», при этом соблюдая правила русского языка? Это означает что во-первых нужно поддерживать вложенность, а во-вторых последние кавычки схлопываются, если не ошибаюсь. То есть, например, "По приказу ОАО "Рога и Копыта"" должно превратиться в «По приказу ОАО «Рога и Копыта».

Нашел regexp-ы, но они не заменяют вложенные, плюс нужно учитывать что последние могут схлопнуться.
  • Вопрос задан
  • 456 просмотров
Пригласить эксперта
Ответы на вопрос 3
ArsenyMatytsyn
@ArsenyMatytsyn Куратор тега JavaScript
Руководитель frontend направления, предприниматель
Если не хочешь придумывать свой велосипед, то вот.

UPD: А, если ты хочешь, чтобы схлопывались рядом стоящие... то зацепись за это условие. Если два рядом открывающих или закрывающих, то один удаляй с помощью той же регулярки. Но в моем базовом ответе все это уже все сделали за тебя.
Ответ написан
Adamos
@Adamos
последние кавычки схлопываются, если не ошибаюсь

Ошибаетесь: www.rosental-book.ru/punct_xxxiv.html#sect135
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Так-себе вариант, который работает с текстом из вопроса, но позорно провалится на пустой паре кавычек )
v.0.1
const src = '"По приказу ОАО "Рога и Копыта""';

src.split('').reduce((acc,c,i,arr) => {
  if (c === '"') {
    const prev = i ? arr[i - 1] : '';
    if (i && prev !== ' ') {
      if (prev === '"') return acc;
      acc += '»';
    } else {
      acc += '«';
    }
  } else {
    acc += c;
  }
  return acc;
}, '')


Upd. версия подлиннее, но пустые кавычки более ли менее
v.0.2
const requote = source => {
  const Q_OPEN = 1;
  const Q_CLOSE = 2;
  const SPACE = 3;
  const OTHER = 4;

  let prev = SPACE;

  return source.split('').reduce((acc, c, i, arr) => {
    if (c === '"') {
      if (prev !== SPACE) {
        if (prev === Q_CLOSE) return acc;
        acc += '»';
        prev = Q_CLOSE;
      } else {
        acc += '«';
        prev = Q_OPEN;
      }
    } else {
      acc += c;
      prev = c === ' ' ? SPACE : OTHER;
    }
    return acc;
  }, '')
}

requote(src)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы