Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97

Открыть новую тему     Написать ответ в эту тему

leftMIND

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
   Регулярные выражения
Обучающий материал
  • Книги    
  • Шпаргалки: от AZJIO (AutoIt3, PCRE) от Dave Child
  • wikipedia.org - Регулярные выражения на wiki  
  • edlinsoft.blogspot.com - Регулярные выражения в .NET Framework  
  • php.ru - Синтаксис регулярных выражений  
  • php.net - Синтаксис регулярных выражений  
  • regexpstudio.com - Регулярные выражения для Delphi  
    Официальные источники:
  • docs.notepad-plus-plus.org - Официальный источник Notepad++ (англ. яз.)  
  • pcre.org - Официальный справочник движка PCRE (англ. яз.)  

  •    Тестирование регулярных выражений
    Программы
    Онлайн сервисы
  • RegexBuddy - крутая и платная  
  • RegExp - бесплатно, AZJIO, PCRE, AutoIt3  
  • Expresso  
  • The Regex Coach  
  • RegExstar, Github (AutoHotKey, PCRE)
  • Обзор программ от ManHunter    
  • regexr.com здесь в Community множество готовых регулярных выражений  
  • pagecolumn.com - для javascript  
  • pagecolumn.com - для php  
  • cuneytyilmaz.com - для javascript  
  • php-include.ru - на флеш-плеере  
  • regex101.com  
  • easyregexp.ru  
  • debuggex.com - показывает структурно  

  •    Схожие темы
  • javascript регулярные выражения
  • PHP: Регулярные выражения (RegExp, Regular, eregi, preg)
  • Игра - Регулярно выражайтесь!
     
    первое сообщение темы...
    Обсуждение шапки данной темы ведётся в этой теме
    Рекомендации по составлению вопросов в данной теме:

  • Всего записей: 33 | Зарегистр. 07-04-2002 | Отправлено: 23:55 15-10-2002 | Исправлено: AZJIO, 15:18 12-02-2021
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    "в цепочке символов длиной не более 400 символов должны встречаться в произвольном порядке любые не менее чем 5 из данных 10-ти слов" и далее перечисляются слова.

    Дословно (каждое слово из десяти, должно быть отдельным словом, т.е. наличие совпадающего слова в составе другого - игнорируется):

    Код:
    (?s)(?!\A.{401,})\A(?:.*?\b(?>one|two|three|four|five|six|seven|eight|nine|ten)\b){5}

    тестовый массив (перевод строки - CRLF):

    Код:
    abcd one by two one  five  defghi j klmonetwothreenobdyejnbsdk
    doajre]oinve]onre'lkmnfx'`]kcd)o )(U89biksdkj)dlknsd
    mbfdjb jherwoijcn kjnspomcoijs
    lkfds;ljs
    lsmwopije fhihsdlm';sod['pjkss
    dfjugisvbwekjbsalkjsslhnsdijnvs
    jsldk slkjiireeeeeeeeeeeeeeeeenbfsljh sjbhhhhhhhsujsljf
    dsjslnlknds three four ten nine djkhsdhrwe rwhroihwqerbpija
    kdddddddddddddddddddddddddddddddmlkjjfsd;lksd'
    ;kkkkk';

    - если добавить в массив один или более символов (итого - более 400), совпадения не будет найдено.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:37 15-05-2019 | Исправлено: YuS_2, 17:43 15-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее...

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 17:38 15-05-2019 | Исправлено: IvanStepanov, 17:47 15-05-2019
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    В файле нужно найти фрагмент текста, длиной не более 400 символов, в котором содержатся не менее чем 5 слов из заданного списка из 10-ти слов

    Так это надо было сразу написать... т.е. фрагмент произвольный?

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:45 15-05-2019 | Исправлено: YuS_2, 17:46 15-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    т.е. фрагмент произвольный?

    Скажем так, фрагменты могут находится в текстовом файле где угодно в тексте, их может быть несколько, длина их может быть произвольной, но не более 400 символов, между словами могут быть другие слова, не входящие в список

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 17:48 15-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov (Пост)

    Цитата:
    Ну да.

     
    Фрагмент текста и строка это не равнозначные понятия. Если вам нужно осуществлять поиск безотносительно перевода строки, ищя фрагменты, где от первого символа найденного слова до последнего символа пятого найденного слова дистанция не будет превышать 400 символов, то в рамках чисто регулярных выражений эта задача не имеет решения.
     
    Это может быть реализовано программно, в рамках того или иного ЯП. Javascript, к примеру, в объекте RegExp имеет свойство lastIndex, с помощью которого можно вычислить дистанцию между index и lastIndex. Можно, также, захватывать всё совпадение в группу и проверять её длину. Вариантов может быть много... В общем, предлагаю копать в эту сторону.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 17:54 15-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    от первого символа найденного слова до последнего символа пятого найденного слова

    Задача ещё сложней.
    Не до пятого слова, а до того, сколько их уместилось во фрагменте длиной не более 400 символов.
     

    Цитата:
    в рамках чисто регулярных выражений эта задача не имеет решения

    понял

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 18:25 15-05-2019 | Исправлено: IvanStepanov, 18:26 15-05-2019
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    фрагменты могут находится в текстовом файле где угодно в тексте, их может быть несколько, длина их может быть произвольной, но не более 400 символов

    Выше правильно подсказывают, такую задачу решать надо в рамках какого-либо ЯП, т.к. чистыми регэкспами количество захваченных символов посчитать, пока возможности нет...
    Если устроит powershell, можно на нем сделать.
     
    Добавлено:

    Цитата:
    Не до пятого слова, а до того, сколько их уместилось во фрагменте длиной не более 400 символов.

    Тут следует уточнить все условия и как можно полнее...

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:28 15-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov (Пост)

    Цитата:
    Не до пятого слова, а до того, сколько их уместилось во фрагменте длиной не более 400 символов.

    Прям ребусы какие-то)) Нельзя ли внятно сформулировать задачу? Хотя, уже видно, что не реализуемо.
     
    Даже в процитированном мною вашем высказывании масса недосказанностей.
    - начиная откуда? С начала текста? Строки? Первого совпадения?
    - что конкретно требуется получить? Количество слов, помещающееся в подстроку, длиной не более 400 символов? Сами слова? Или всю эту подстроку? А если в 400 символов помещается, к примеру, 7 слов, а не 5? Ограничиться пятью? Или захватить по максимуму, нов рамках тех же 400 символов?...
    - как быть с "пересекающимися" диапазонами? Если, к примеру, 6 слов находятся в рамках, скажем, 300, а последующие 4 в рамках ещё 200. Нужно ли делить 5 + 5, либо отдать приоритет максимальному захвату, скажем в 7, если эти 7 "влазят" в 400 (на определённом участке из общих 500)?
     
    Вынос мозга в общем, какой-то.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 18:39 15-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Вынос мозга в общем, какой-то

    Задача на самом деле простая (для человека, а не для программы) и не "высосанная из пальца", а насущная.
     
    В тексте нужно удалить куски, не несущие полезной информации или которые я читал.
    Сниппеты яндекса.
     
    А текстов таких много. Несколько сотен тысяч файлов. Поэтому вручную просмотреть и удалить - жизни не хватит.
     
    Для чего идентифицировать безполезные сниппеты хочу по наличию в них определенных слов.
    Если в сниппете есть 5 и более слов из заданного списка - значит сниппет удаляем.
     
    Причём под словами я понимаю не слова в общем смысле этого слова, а непрерывные цепочки символов.
     
    Учитывая что фразу можно сформулировать по разному, порядок слов не должен учитываться.
    Также сниппет может иметь  разную длину.
     
    Вообщем, как-то так

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 18:55 15-05-2019 | Исправлено: IvanStepanov, 18:57 15-05-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2

    Цитата:
    Вольным локализаторам по рукам бы надавать за такие переводы
    мой используй, я указал "(?s)", кто знает тот поймёт.
     
    IvanStepanov
    Поизучай AutoIt3, он лёгок в понимании, и многие задачи можешь легко выполнить.

    Всего записей: 4544 | Зарегистр. 03-05-2006 | Отправлено: 19:18 15-05-2019 | Исправлено: AZJIO, 19:26 15-05-2019
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    В тексте нужно удалить куски, не несущие полезной информации или которые я читал. Сниппеты яндекса.

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

    Всего записей: 1366 | Зарегистр. 17-01-2011 | Отправлено: 19:26 15-05-2019
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    Задача на самом деле простая

    Она могла бы быть простой, если бы у неё были четкие условия. Пока что, задача слишком расплывчата.
    Например:

    Цитата:
    Не до пятого слова, а до того, сколько их уместилось во фрагменте длиной не более 400 символов.

    Что, в данном случае, первично? Количество символов или количество слов?
    Т.е. например,  
    1. находим первое слово, отсчитываем 400 символов, считаем количество искомых слов попавших во фрагмент, выполняем проверку и какие-то действия (какие, кстати?)
    или
    2. находим пять слов по шаблону, считаем количество символов захваченного фрагмента, сравниваем с ограничением в 400 и далее по алгоритму...
     
    Какой вариант требуется?
    и т.д.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:34 15-05-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov
    Попробуй моей утилитой TextReplace
    1. Сниппет = один файл или в одном файле несколько сниппетов? Если несколько то разделить (писать скрипт разделения)
    2. Запускаешь прогу ищешь первое слово (цепочку символов), снизу кнопка для экспорта списка файлов.
    3. Кидаешь список файлов в поле "папка поиска", указываешь второе слово, получаешь опять список файлов и кидаешь его в поле. Повторяешь так 5 раз.
    4. На выходе получаем список, в котором содержаться все пять слов. Скармливаешь его опять программе и задаёшь регулярку чтобы удалила в файле всё от начала до конца (?s)\A.++\z и сортируешь по размеру, пустышки удаляешь.
     
    YuS_2
    В условии
    Цитата:
    порядок слов не должен учитываться
    этим всё сказано

    Всего записей: 4544 | Зарегистр. 03-05-2006 | Отправлено: 19:37 15-05-2019 | Исправлено: AZJIO, 19:41 15-05-2019
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO

    Цитата:
    мой используй, я указал "(?s)", кто знает тот поймёт.

    да я AkelPad-ом уже привык пользоваться, а перевести и сам смогу, если вдруг понадобится... кстати, от встроенного, вообще коробит из-за пляшущего регистра символов внутри строк
     
    Добавлено:
    AZJIO

    Цитата:
    В условии  

    Цитата:
    порядок слов не должен учитываться

    этим всё сказано  

    Далеко не всё. Да и с этим именно, вопросов и не возникает... там другие условия не стыкуются.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:40 15-05-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2

    Цитата:
    из-за пляшущего регистра
    мы с DmitryFedorov жёстко спорили за каждой буквой, такие мелочи как пляшущий регистр один из тысячи недостатков. Просто 11 страниц жёсткого спора здесь не описать.

    Всего записей: 4544 | Зарегистр. 03-05-2006 | Отправлено: 19:44 15-05-2019 | Исправлено: AZJIO, 19:51 15-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2

    Цитата:
    Что, в данном случае, первично? Количество символов или количество слов?
    Т.е. например,  
    1. находим первое слово, отсчитываем 400 символов, считаем количество искомых слов попавших во фрагмент, выполняем проверку и какие-то действия (какие, кстати?)
    или
    2. находим пять слов по шаблону, считаем количество символов захваченного фрагмента, сравниваем с ограничением в 400 и далее по алгоритму...
     
    Какой вариант требуется?  

    Второй
     
    Т.е. если не менее 5-ти нужных слов вместе с ненужными уместилось в 400 символов - значит нашли то что нужно

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 19:58 15-05-2019
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    Второй

    Ок, поехали дальше:

    Цитата:
    если не менее 5-ти нужных слов вместе с ненужными уместилось в 400 символов - значит нашли то что нужно

    Учитывая то, что механизм регэкспов не отдает уже захваченный фрагмент на повторную проверку, то найденные пять слов, не попавшие в рамки 400 символов, повторно проверяться не будут, т.е. не совпало - ну и фиг с ним, бросаем найденные, переходим уже к следующему слову.
    Например, массив, опубликованный здесь:
     15-05-2019
    при таком подходе, отдаст три (не два!) фрагмента такого текста...

    Код:
    Всего совпадений: 3
    ==========
    Длина фрагмента: 30
    ---
    seven  бла three four five six
    ==========
    Длина фрагмента: 25
    ---
    three four five six seven
    ==========
    Длина фрагмента: 25
    ---
    five six seven eight nine
    ==========

    - проверьте. Устраивает такой подход?

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:21 15-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Устраивает такой подход?

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

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 15:09 19-05-2019
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    Да.

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

    Цитата:
    найти в тексте максимально длинные не пересекающиеся одинаковые (без учета пробельных символов) куски текста

    это уже другая задача, требующая уточнений и подробностей.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:07 19-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2

    Цитата:
    это уже другая задача

    Естественно.
    Я просто подумал, что это более простая задача.
     
    Расскажу поподробней.
    Нужно найти фрагмент текста (не строку, а в общем случае многострочный фрагмент не обязательно заканчивающийся символом "конец строки") - т.е. нужно найти цепочку символов, такую, что в файле есть ещё точно такая же с точностью до пробельных символов. Т.е. если между словами в другой цепочки больше (или меньше) пробелов, символов табуляции или \r\n - это не должно учитываться.
     
    И цепочки не должны накладываться друг друга (т.е. не должно быть символов, которые входят в обе цепочки).
     
    И цепочки должны иметь максимальную длину.
     
    Т.е. нужно найти самую длинную цепочку, у которой в файле есть как минимум один клон.
     
    Например цепочки  

    Код:
    мама мыла раму

     
    и  

    Код:
    мама      мыла
    раму

     
    считаются клонами

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 18:46 19-05-2019
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru