Удалить повторяющиеся символы с помощью регулярного выражения

Как бы вы удалили повторяющиеся символы в регулярном выражении, в то время как некоторые символы должны повторяться?

Например, у меня есть BBAALLLLOOOONN, и я хочу, чтобы вывод был просто BALLOON.

Я пробовал это регулярное выражение: /(.)(?=\1)/g, но результатом будет BALON вместо BALLOON.


person HaiHey    schedule 10.07.2020    source источник
comment
Единственный способ - иметь английский словарь. Или все слова всегда повторяются? Потому что если это так, забудьте регулярное выражение. A="BBAALLLLOOOONN"; A(1:2:end)   -  person Ander Biguri    schedule 10.07.2020
comment
Привет. Все символы (не слова) повторяются в файле .txt, который я читаю с четных знаков препинания и цифр.   -  person HaiHey    schedule 10.07.2020


Ответы (2)


Использовать

regexprep(line, '([A-Za-z])\1', '$1')

См. доказательство.

() — это группа захвата, на которую ссылается \1, \1 потребляет повторяющийся символ, и для каждого совпадения возвращается только захваченная буква, поскольку шаблон замены — это обратная ссылка $1.

person Ryszard Czech    schedule 10.07.2020
comment
Имеет смысл. Благодарю вас! - person HaiHey; 12.07.2020

не используйте просмотр вперед. заменить (.)\1 на \1.

В рубине это будет "BBAALLLLOOOONN".gsub(/(.)\1/, '\1')

person ruud    schedule 10.07.2020
comment
Вопрос про MATLAB - person Paolo; 10.07.2020
comment
Хорошо, но речь идет о регулярных выражениях, несложно адаптировать пример ruby ​​к чему угодно. - person ruud; 10.07.2020
comment
Хотя это правда, разные языки поддерживают разные функции регулярных выражений. - person Paolo; 10.07.2020
comment
Спасибо. Именно то, что мне было нужно. Если кому-то интересно, это эквивалентная логика в Matlab: regexprep(строка, формат, '$1'), где строка - это строка символов с дубликатами, такими как BBAALLLLOOOONN!!, формат - это регулярное выражение, которое равно '(.)\1 ' и '$1' равно '\1' - person HaiHey; 10.07.2020
comment
HaiHey, просмотр вперед не «потребляет» то, что он означает. Итак, в вашей версии вы сопоставили любой символ, за которым следует такой же символ, но второго в совпадении не было. Следующее глобальное совпадение снова совпадет с этим вторым символом, если за ним следует тот же символ. Эта версия использует второй символ, поэтому следующее глобальное совпадение начинается после этого второго символа. - person ruud; 11.07.2020