Это выражение (вдохновленное Майком, выше), кажется, улавливает все дубликаты, тройки и т. Д., Включая те, что находятся в конце строки, чего большинство других не делает:
/(^|\s+)(\S+)(($|\s+)\2)+/g, "$1$2")
Я знаю, что вопрос задан для совпадения только дубликаты , но триплет - это просто 2 дубликата рядом друг с другом:)
Во-первых, я ставлю (^|\s+)
, чтобы убедиться, что он начинается с полного слова, в противном случае «детский стейк» переходит к «детский стейк» («s» соответствует). Затем он сопоставляет все полные слова ((\b\S+\b)
), за которыми следует конец строки ($
) или количество пробелов (\s+
), причем целое повторяется более одного раза.
Я попробовал это так, и это сработало:
var s = "here here here here is ahi-ahi ahi-ahi ahi-ahi joe's joe's joe's joe's joe's the result result result";
print( s.replace( /(\b\S+\b)(($|\s+)\1)+/g, "$1"))
--> here is ahi-ahi joe's the result