Регулярное Выражение Для Последовательных Повторяющихся Слов



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




Париж на весна.



Не что это связано.



Почему ты смеешься? Являются мой регулярные выражения, что плохо??




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

883   12  

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

вот один, который ловит несколько слов несколько раз:

(\b\w+\b)(\s+)+

регулярное выражение для удаления 2 + повторяющихся слов (последовательных/не последовательных слов)

попробуйте это регулярное выражение, которое может поймать 2 или более дубликатов слов и оставить только одно слово. И повторяющиеся слова Не нужно даже быть последовательным.

/(\b\w+\b)(?=\b.*\b)/ig

здесь \b используется для границы слова, ?= используется для положительного взгляда, и используется для обратные ссылки.

пример источник

Comments

    Ничего не найдено.