Как найти двойные буквы и заменить их тройными буквами? - PullRequest
4 голосов
/ 03 июня 2019

Я не использую какой-либо конкретный язык кодирования, просто программу с «find» и «replace», где оба поля используют Regex. Например, фраза

too many professionals

превратится в

tooo many professsionals

Я хочу "найти" любые вхождения двойных букв, которые, как я знаю, я могу сделать с

(.)\1

Что меня смущает, так это бит «возьми удвоенную букву и утрои ее». Есть ли в Regex какой-либо символ, который ссылается на «текущий символ» или что-то в этом роде?

РЕДАКТИРОВАТЬ: Спасибо всем за ваши предложения. Оказывается, что в поле «замена» фактически не используется Regex, а IMO - это bullcrap, и мой вопрос теперь бесполезен.

Ответы [ 5 ]

3 голосов
/ 03 июня 2019

Двойной к тройной

Найти (?m)(?:([a-zA-Z])(?!\1)|^)(([a-zA-Z])\3)(?!\3)
Заменить $1$2$3

https://regex101.com/r/tOpl82/1

Объяснено

 (?m)                          # Multi-line mode     
 (?:
      ( [a-zA-Z] )                  # (1), Character behind
      (?! \1 )                      #      not a dup.
   |                              # or, 
      ^                             # BOL
 )
 (                             # (2 start)
      ( [a-zA-Z] )                  # (3), Character to dup check
      \3                            #      this is duped.
 )                             # (2 end)
 (?! \3 )                      # The dup can't be a triple
3 голосов
/ 03 июня 2019

Тим выражение неверно, потому что (.) относится к любому символу, который мы не хотим заменять этим.Мы хотим заменить только (английские) буквы или [A-Za-z].

. Для этого можно использовать выражение с флагом i:

([a-z])\1

или, возможно, выражение.без i флаг:

([A-Za-z])\1

Демо

Тест

const regex = /([a-z])\1/gmi;
const str = `too many   professionals
would    turn into

tooo many professsionals`;
const subst = `$1$1$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

3 голосов
/ 03 июня 2019

Ваш текущий паттерн (.)\1, который использует обратную ссылку, находится на правильном пути.Попробуйте найти и заменить:

Find:    (.)\1
Replace: $1$1$1

Демо

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

1 голос
/ 03 июня 2019

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

(([A-Za-z])\2\2+)|(\w)\3

Заменить на:

$1$3$3$3

Идея состоит в том, чтобы запечатлеть в группе одну тройку или более букв | или в группе 3 двойные буквы. Только одна группа может соответствовать: группа 1 или группа 3. В замен любая группа всегда будет пустой.

Вот демоверсия в regex101

1 голос
/ 03 июня 2019

Это почти часть вашего вопроса:).

Это также зависит от используемого вами регулярного выражения.

например. для GNU SED это

$ echo 'ffoobarr' | sed -e 's/\(.\)\1/\1\1\1/g'
fffooobarrr

Итак, чтобы обойти это, я просто использовал \1\1\1 в качестве шаблона замены.

...