Замена одной из двух больших букв подряд

Помогите, пожалуйста, в построении регулярки, если такое вообще возможно. В регулярках могу составлять разные паттерны, но тут своими знаниями не разберусь: мне необходимо определить есть ли в слове две или три идущие подряд заглавные буквы и если они есть, удалить, оставив последнюю из двух или трех заглавных букв. Заглавные буквы могут быть только вначале слова. Например, из слова МММорковь, нужно сделать слово Морковь. Из слова ГГруша - слово Груша. Спасибо!


Ответы (1 шт):

Автор решения: UModeL

Не смотря на уточнение про аббревиатуры, хотелось всё же какой-то универсальности.

/([^\w]|^)([А-ЯЁ])+(\2(?=[а-яё]))/gm    =>    $1$2

Регулярные выражения в JS имеют некоторые ограничения (например, lookbehind), поэтому выглядят иногда запутанно и громоздко. Ждём, когда дополнят, а пока выкручиваемся, как можем:

let sTxt = `ППревратить МММорковь в Морковь. Из слова ГГруша, сделать слово Груша.
Ни ООО "РогаИКопыта" ни новая райДЕЗ не следуют требованиям СНиП и КЗоТ.
Во времена СССР, ЦПКиО Санкт-ППетербурга присваивается имя С. М. КККККирова.
МВ-печь и МТ-ЛБ - техника.`;

let rExp = /([^\w]|^)([А-ЯЁ])+(\2(?=[а-яё]))/gm;

console.error(sTxt); // Исходный текст
console.info(sTxt.replace(rExp, '$1$2'));

→ Ссылка