Регулярное Выражение Для Последовательных Повторяющихся Слов
Я новичок в регулярном выражении, и я не могу понять, как написать одно регулярное выражение, которое будет "соответствовать" любым повторяющимся последовательным словам, таким как:
Париж на весна.
Не что это связано.
Почему ты смеешься? Являются мой регулярные выражения, что плохо??
есть регулярное выражение, которое будет соответствовать всем жирные строки выше?
12 ответов:
попробовать это регулярное выражение:
\b(\w+)\s+\bздесь
\b- это граница слова иссылается на захваченный матч первой группы.
Я считаю, что это регулярное выражение обрабатывает больше ситуаций:
/(\b\S+\b)\s+\b\b/хороший выбор тестовых строк можно найти здесь:http://callumacrae.github.com/regex-tuesday/challenge1.html
широко используемая библиотека PCRE может обрабатывать такие ситуации (вы не достигнете на то же самое с POSIX-совместимыми движками регулярных выражений, хотя):
(\b\w+\b)\W+
попробуйте это с ниже RE
- \B начало слова граница слова
- \W + любой символ слова
- \1 то же самое слово соответствует уже
- \B конце слова
() * повторяем еще раз
public static void main(String[] args) { String regex = "\b(\w+)(\b\W+\b\1\b)*";// "/* Write a RegEx matching repeated words here. */"; Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE/* Insert the correct Pattern flag here.*/); Scanner in = new Scanner(System.in); int numSentences = Integer.parseInt(in.nextLine()); while (numSentences-- > 0) { String input = in.nextLine(); Matcher m = p.matcher(input); // Check for subsequences of input that match the compiled pattern while (m.find()) { input = input.replaceAll(m.group(0),m.group(1)); } // Prints the modified sentence. System.out.println(input); } in.close(); }
нет. Это неправильная грамматика. Могут быть определенные для движка/языка регулярные выражения, которые вы можете использовать, но нет универсального регулярного выражения, которое может это сделать.
пример в Javascript: хорошие части могут быть адаптированы для этого:
var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]+)\s+(?:\s|$)/gi;\b использует \w для границ слов, где \w эквивалентно [0-9A-Z_a-z]. Если вы не возражаете против этого ограничения, принятый ответ в порядке.
это регулярное выражение, которое я использую для удаления повторяющихся фраз в моем twitch bot:
(\S+\s*){2,}
(\S+\s*)ищет любую строку символов, которая не пробелом, а затем пробел.
{2,}затем ищет более 2 экземпляров этой фразы в строке, чтобы соответствовать. Если есть 3 фразы, которые идентичны, совпадает.
это выражение (вдохновленное Майком, выше), похоже, ловит все дубликаты, трипликаты и т. д., включая те, которые находятся в конце строки, чего большинство других не делают:
/(^|\s+)(\S+)(($|\s+))+/g, "")Я знаю, что вопрос задан, чтобы соответствовать дубликаты только, но трипликат-это всего 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+))+/g, "")) --> here is ahi-ahi joe's the result
поскольку некоторые разработчики приходят на эту страницу в поисках решения, которое не только устраняет повторяющиеся последовательные подстроки без пробелов, но и трипликатов и за их пределами, я покажу адаптированный шаблон.
шаблон:
/(\b\S+)(?:\s+\b)+/(Демо Шаблона)
Заменить:(заменяет полное совпадение с группой захвата #1)этот шаблон жадно соответствует" целой " подстроке без пробелов, а затем требует одну или несколько копий сопоставленного подстрока, которая может быть разделена одним или несколькими пробелами (пробел, табуляция, новая строка и т. д.).
в частности:
\b(граница слова) символы имеют жизненно важное значение для обеспечения частичных слов не совпадают.- вторая скобка-это группа без захвата, потому что эту подстроку переменной ширины не нужно захватывать-только сопоставлять/поглощать.
- the
+(один или несколько кванторов) на группе без захвата больше уместнее, чем*, потому что*будет "беспокоить" механизм регулярных выражений для захвата и замены одноэлементных вхождений - это расточительный дизайн шаблона.*Примечание Если вы имеете дело с предложениями или входными строками с пунктуацией, то шаблон должен быть дополнительно уточнен.
используйте это в случае, если вы хотите, чтобы регистр без учета проверки повторяющихся слов.
(?i)\b(\w+)\s+\1\b
регулярное выражение для удаления 2 + повторяющихся слов (последовательных/не последовательных слов)
попробуйте это регулярное выражение, которое может поймать 2 или более дубликатов слов и оставить только одно слово. И повторяющиеся слова Не нужно даже быть последовательным.
/(\b\w+\b)(?=\b.*\b)/igздесь
\bиспользуется для границы слова,?=используется для положительного взгляда, ииспользуется для обратные ссылки.
Comments