Я хочу использовать регулярное выражение для удаления повторяющихся последовательностей символов (слов) из строки. Мой вопрос похож на вопрос под названием регулярное выражение для повторяющихся слов, но у меня есть некоторые дополнительные требования.
Мне нужно включить дополнительные символы. Принятый ответ на связанный вопрос определяет только слова, состоящие из буквенно-цифровых символов, но мне нужно включить в определение слова символы, такие как «@».
Мне нужно сопоставить несколько повторений шаблона. Если слово повторяется три раза, принятый ответ на связанный вопрос удаляет только один из дубликатов, но мне нужно удалить их оба.
Вот пример строки, которую я использую для тестирования:
hello me now @@@ @@@ @@@ then method me @@@
Мой желаемый результат:
hello me now @@@ then method me @@@
Ключами к решению этой проблемы являются:
\s
) и непробелы (\S
).Вот регулярное выражение, которое вам нужно: /(?<=(\S+)\s+)\1\s+/g
Вот демонстрация того, как это работает.
Вот скриншот демонстрации.
Теперь я объясню процесс создания этого регулярного выражения. Для начала сформулируем цель. Цель состоит в том, чтобы сопоставить любое слово, которое совпадает с предыдущим словом, чтобы мы могли его удалить, то есть ничем заменить. Итак, давайте пройдемся по процессу:
\w+
, но он соответствует только буквенно-цифровым символам. Вместо этого используйте \S+
, который соответствует всем символам, которые не считаются пробелами. Обратите внимание, что оно соответствует «@@@» так же, как и обычным словам.(?<= ... )
, ищем слово \S+
, за которым следует пробел \s+
. На скриншоте видно, что самое первое слово в строке больше не соответствует. Идеальный.\S+
внутри выражения просмотра назад), а затем обратиться к этой захваченной группе в нашем совпадении (заменив исходное \S+
на \1
).\s+
в конец. Это подводит нас к окончательному результату, который я проиллюстрировал в начале этого ответа./(?<=(\S+)\s+)\1\s+/g
Вы можете сопоставить
(?<!\S)(\S+)(?:\s+\1)+
и заменить группой 1$1
См. regex101.com/r/tlsMRh/1