Регулярное выражение для удаления последовательных дубликатов (целых чисел и/или чисел с плавающей запятой) из списка, разделенного запятыми

#regex #duplicates #comma #csv

Вопрос:

Насколько я видел, здесь нет точного вопроса, подобного этому.

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

 1,1,1.28,1.35,1.4,1.4,2,2,4,7.5,7.56
 

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

Я пробовал разные варианты , и пока что лучший был ?:^|,)([^,] )(,[ ]*1) , но, очевидно, он не учитывает такие случаи, как 1,1,1.28 (см. демонстрацию).

Проще говоря, регулярное выражение, которое мне понадобится:

 Whatever there's inside two commas, match if there is a duplicate
 

Я был бы очень признателен вам за помощь!

Спасибо

Комментарии:

1. Добро пожаловать в stackoverflow. Вы вряд ли получите ответ на свой вопрос, пока не опубликуете свой собственный код, показывающий попытки, которые вы предприняли, чтобы решить проблему самостоятельно. Также вы должны пометить вопрос, чтобы показать, какой язык вы используете для своих регулярных выражений.

Ответ №1:

Вы можете использовать

 (?<![^D,])(d (?:.d )?)(?:,1) (?![^,]|.?d)
 

Заменить на $1 . Смотрите демонстрацию регулярных выражений.

Подробные сведения:

  • (?<![^D,]) — непосредственно слева от текущего местоположения не может быть никаких символов, кроме не-цифры или запятой
  • (d (?:.d )?) — Группа 1: одна или несколько цифр, за которыми следует необязательная последовательность . и одна или несколько цифр.
  • (?:,1) — одна или несколько последовательностей значений запятой и группы 1
  • (?![^,]|.?d) — сразу справа не может быть символа, кроме a , или необязательного . , за которым следует цифра.

Комментарии:

1. спасибо, похоже, что изменение его для (?<![^D,])(d (?:.d )?)(?:,1) (?![^,s*]|.?d) решения проблемы 1.28,1.28,1,1,,1,1.18,1.18 . Без s* последнего отрицательного взгляда он не рассматривал дубликаты в конце списка, которые не заканчиваются запятой. Спасибо!

Ответ №2:

Мое мнение об этом таково:

 (bd (?:.d )?b)(?:,1) [^.d]
 

Что особенно хорошо в этом, так это то, что он соответствует всем запятым между повторяющимися числами. Это удобно в случае, если вам нужно только сохранить одну копию число в списке и удалить все остальные — можно просто удалить весь матч и заменить его обратно с 1 группе контент, и запятая заказ все равно будет как положено — a,b,c ! Или в случае, если вам нужно удалить дубликаты, просто удалить все совпадения (опять же, порядок будет тот же).

Объяснение:

  • (bd (?:.d )?b) соответствует числу, возможно, десятичной дроби. «границы» используются для того,чтобы не совпадать с»…, 1 1,1,…». Такой точный порядок чисел не допускается (11>1), но я вставил его просто для того, чтобы убедиться, что подобных проблем не возникнет.
  • (?:,1) совпадает с запятой, а затем с ранее найденным номером. Здесь мы используем тот факт, что числа отсортированы.
  • [^.d] это сложно: в случае, если первое несущественное число имеет точку, а совпадение-нет, мы должны остановиться и не совпадать с точкой. Также мы не должны совпадать с «7.5,7.56», и для этого мы можем использовать «не цифра». Но тогда мы должны соответствовать всему остальному, включая конец строки. Поэтому в качестве замены «не цифра И не точка» я использовал «не (цифра или точка)».

Комментарии:

1. Спасибо! Похоже, это тоже работает, и тот же комментарий к другому ответу тоже применим. Не ожидал немедленной поддержки 🙂 Похоже, регулярные выражения в наши дни являются горячими темами