Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

Поиск слов с помощью регулярных выражений

#регулярные_выражения

                    
Как составить регулярное выражение на поиск слов(а) в тексте при условии, что данное
слово появляется более n-раз.


  Пример.
  
  Ищем слово 'world', которое встречается ровно 3 и более раза



Hello my world
Hello my world, hello my world, hello my world


Регулярка не должна находить соответствие в первом тексте, но во втором найдет все
3  и более слова.
    


Ответы

Ответ 1



Можно попробовать вот такой вариант (на основе на основе этого ответа): /(\b\w+\b)(?=(?:.*?\b\1\b){2,})/ig Пример: https://regex101.com/r/cS2sH3/1 Сразу обращаю внимание, что если вхождений больше трех, то слово будет выбрано несколько раз (количество вхождений минус 2). Несколько пояснений о том, как работает это регулярное выражение: (\b\w+\b) маска захватывает "слово". При этом, символы \b обозначают границу слова и не захватываются маской. \1 используется для ссылки на найденную последовательность символов. .*?\b\1\b следует читать как "ранее найденное слово, которому предшествует один или более произвольных символов". (?: ... ){2,} определяется группа символов, которая повоторяется 2 или более раз. При этом используется незахватывающая маска (?:) Группа abc(?=def) проверяет, следует ли указанная группа символов за def за символами abc, не сдвигая при этом текущую позицию в строке. Ну и в целом, есть у меня такое чувство, что при решении задачи лучше использовать не только регулярное выражение, но и программный код.

Ответ 2



UPD Я бы просто пользовался обратными ссылками: ^.*(world)(.*(\1)){2}.*$ ^ n-1 раз повторений Пример: https://regex101.com/r/zK2hG2/3

Ответ 3



console.log([ "Hello my world", "Hello my world, hello my world, hello my world", "Hell hello he", "123 1234 2345 3456 666 999 000 123", "123 1234 2345 3456 123 666 999 123 000 123",].map(function(s) { var match = s.match(/\b(\w+)\b(?=(.*?\b\1\b){2})/gi); return match ? match.join(" ") : ""; }).join("\n")) Вывод: Hello my world 123 123 Чтобы слово находилось только один раз: console.log([ "Hello my world", "Hello my world, hello my world, hello my world", "Hell hello he", "123 1234 2345 3456 666 999 000 123", "123 1234 2345 3456 123 666 999 000 123 123",].map(function(s) { var match = s.match(/\b(\w+)\b(?=(((?!\b\1\b).)*?\b\1\b){2}((?!\b\1\b).)*$)/gi); return match ? match.join(" ") : ""; }).join("\n")) Вывод: Hello my world 123

Ответ 4



По примеру, ищем world в строке Hello my world, hello my world, hello my world. Регулярное выражение на java будет иметь вид: private final string REGEX = .+(world)+.{3,} Объяснение: .+ предполагает, что перед словом world могут быть любые символы либо другие слова. +. предполагает, что после слова world так же могут быть другие символы или слова. {3,} означает последовательность минимум из 3-х символов X, а X = world P.S.: Если что-то не так, поправьте меня.

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

Отправить комментарий