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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

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
    Hjkma

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sikemo
    в Notepad++ сработало только на последней строке и то не корректно, через замену на \1 \r\n \2 сделало так:

    Цитата:
    D:\favorites\description\large\  
     black-white

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 20:45 13-01-2019
    VVL99

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hjkma
    Пока спецов нет, побалуюсь:
    текст:
    Цитата:
    D:\favorites\description\file1.txt  
    D:\favorites\description\small\file2.txt  
    D:\favorites\description\large\file3.txt  
    D:\favorites\description\large\black-white\file4.txt

    1.
    рег:
    Код:
    ^.*?\\.*?\\.*?\\

    рез:
    Код:
    D:\favorites\description\  
    D:\favorites\description\  
    D:\favorites\description\  
    D:\favorites\description\

    2.
    рег:
    Код:
    ^.*?\\.*?\\.*?\\\K.*?$

    рез:
    Цитата:
    file1.txt  
    small\file2.txt  
    large\file3.txt  
    large\black-white\file4.txt



    ----------
    Гомосексуальность среди модераторов не является психическим расстройством, несмотря на синонимы этого понятия в русском языке.

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 22:03 13-01-2019 | Исправлено: VVL99, 22:09 13-01-2019
    Hjkma

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    пути могут быть разного уровня глубины, не подходит, к сожалению. Привязываться нужно к small, large, black-white подпапкам или к концу пути папок, если таковых подпапок нет.

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 22:21 13-01-2019
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hjkma написал(а)
    Цитата:
    первая захватывает все до "large\", "small\", "black-white\" или если их нет в путях, тогда просто до имени файла, а вторая захватывает все после.

    Для первой группы

    Код:
    ^(.+(large|small|black-white))|(.+\\)

    Для второй группы

    Код:
    ((large|small|black-white)(.+))|(\\\w+\.txt)$

     
    Проверил в Npp на указанных примерах работает.

    Всего записей: 7189 | Зарегистр. 20-03-2009 | Отправлено: 22:40 13-01-2019 | Исправлено: regist123, 22:50 13-01-2019
    Hjkma

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

    Цитата:
    D:\favorites\description\file1.txt

    Не понял что делает первый регекс. Он же не захватывает в первую группу пути до указанных подпапок (как указано у меня в примере), а только вместе с ними.

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 23:21 13-01-2019
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hjkma написал(а)
    Цитата:
    на этом не работает:

    работает на всех. В 4-й группе нужный вам результа.

    Цитата:
     Он же не захватывает в первую группу пути до указанных подпапок (как указано у меня в примере), а только вместе с ними.

    невнимательно посмотрел, но там просто скобки добавить. Могли бы и сами добавить.

    Код:
    ^((.+)(large|small|black-white))|(.+\\)

    Всего записей: 7189 | Зарегистр. 20-03-2009 | Отправлено: 00:45 14-01-2019
    VadKomarov



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Добрый день. Нужна помощь в создании регулярного выражения.
    Задача такая:
    к примеру на сайте ТУТУ.РУ надо выбрать расписание поезда.
    Кто может помочь справиться с данной задачей.
     
    Получит надо примерно такую табличку:
     
    ......
    Юрга    22:15    2 м    22:17    156 км    2 ч 21 м
    Юрга-1    22:15    2 м    22:17    156 км    2 ч 21 м
    Яшкино    22:55    4 м    22:59    202 км    3 ч 1 м
    Тайга    23:25    55 м    00:20    229 км    3 ч 31 м
    ....

    Всего записей: 100 | Зарегистр. 01-05-2005 | Отправлено: 04:20 14-01-2019 | Исправлено: VadKomarov, 04:22 14-01-2019
    Jonmey

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

    Цитата:
    Добрый день. Нужна помощь в создании регулярного выражения.  
    Задача такая:  
    к примеру на сайте ТУТУ.РУ надо выбрать расписание поезда.  
    Кто может помочь справиться с данной задачей.  
     
    Получит надо примерно такую табличку:  
     
    ......  
    Юрга    22:15    2 м    22:17    156 км    2 ч 21 м  
    Юрга-1    22:15    2 м    22:17    156 км    2 ч 21 м  
    Яшкино    22:55    4 м    22:59    202 км    3 ч 1 м  
    Тайга    23:25    55 м    00:20    229 км    3 ч 31 м  

    Там есть такая пиппа
       
    жмакните на нее, а в открывшейся странице выделите таблицу с расписанием и Ctrl-C. Затем в виндовом Блокноте сделайте Ctrl-V.
     
    P.S. Слово "Россия" во второй строке будет лишним - удалите его.

    Всего записей: 1305 | Зарегистр. 17-01-2011 | Отправлено: 05:41 14-01-2019 | Исправлено: Jonmey, 05:48 14-01-2019
    VadKomarov



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Спасибо конечно.
    Но это ручная работа и для каждого расписания так не дело ...  
     

    Цитата:
     
    Там есть такая пиппа  
       
    жмакните на нее, а в открывшейся странице выделите таблицу с расписанием и Ctrl-C. Затем в виндовом Блокноте сделайте Ctrl-V.
     
    P.S. Слово "Россия" во второй строке будет лишним - удалите его.

    [q]
     
    Надо как то "ПАРСИТЬ"
    и поэтому надо регулярное выражение....

    Всего записей: 100 | Зарегистр. 01-05-2005 | Отправлено: 05:58 14-01-2019
    Jonmey

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

    Цитата:
    Но это ручная работа и для каждого расписания так не дело ...

    А вы хотите чтобы вам готовый автоматический парсер-качалку HTML страниц написали?
    Впрочем, если вы готовы платить звонкой твердой монетой, то такое возможно.
     
    P.S. Вышеприведенный же способ можно сделать однокликовым (см. всякие автоиты и т.п.), а запуская оное в пакетном режиме - однокликовым на пачке готовых скачанных файлов.
    Одним единственным регекспом парсинг html страниц, как правило решить невозможно.
     
    Можете воспользоваться любым навороченным парсером (textpipe и тп), составив многошаговый скрипт. Нахаляву вам этого делать не будут, поскольку его составление затратное по времени, но рутинное и неблагодарное по сути дело, поскольку является частным для конкретных страниц, и даже малое изменение которых владельцем сайта приводит к неработоспособности скрипта (см. напр., проблемы скачивания инфы с вебстраниц для разных менеджеров медийного контента - многие из них умерли только потому, что некому обновлять скрипты парсинга страниц сайтов, с которых черпалась информация).

    Всего записей: 1305 | Зарегистр. 17-01-2011 | Отправлено: 06:11 14-01-2019 | Исправлено: Jonmey, 06:26 14-01-2019
    Alex_Piggy

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Доброе время, VadKomarov
    Год назад (10-02-2018 19:07) в личке отправлял Вам bookmarklet - JavaScript, который запускается из строки адреса открытой страницы браузера или сохраняется и запускается как закладка.

    Код:
     
    javascript:(function(){ var table = document.getElementById('route-table').getElementsByTagName("tbody")[0]; var tr = table.getElementsByTagName("tr"); var result =''; for (i=0; i< tr.length; i++){ result = result + '[' + tr[i].children[2].getElementsByTagName("a")[0].getAttribute("href").match(/\d*$/); for (j=2; j<tr[i].children.length;j++){ result = result + ' ' + tr[i].children[j].innerText.trim(); } result=result + ']\n'; } alert(result); })();

    Но там были квадратные скобки и номер города поезда. Без них немного проще -  

    Код:
     
    javascript:(function(){var table=document.getElementById('route-table').getElementsByTagName("tbody")[0];var tr = table.getElementsByTagName("tr");var result ='';for (i=0; i< tr.length; i++){for (j=2;j<tr[i].children.length;j++){result+=' '+tr[i].children[j].innerText.trim();}result+='\n';}alert(result);})();

    Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 07:46 14-01-2019 | Исправлено: Alex_Piggy, 07:49 14-01-2019
    Romul81



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

    Цитата:
    Нужно захватить пути файлов и разобрать по группам (capturing groups). При этом делаются две группы, первая захватывает все до "large\", "small\", "black-white\" или если их нет в путях, тогда просто до имени файла, а вторая захватывает все после.

     
    Вроде так:

    Код:
    ^([C-Z]:\\(?:(?!large|small|black-white)[^\r\n\\]+\\)*)((?:(?:large|small|black-white)\\(?:[^\r\n\\]+\\)*)?[^\r\n\\]+)$

     
    Добавлено:
    VadKomarov

    Цитата:
    Надо как то "ПАРСИТЬ"  
    и поэтому надо регулярное выражение....

    Парсить что? HTML? Или буфер обмена копированного со станицы текста?
    Каким инструментом? Текстовый редактор? Скрипт? TextPipe?
    Регулярное выражение для чего (какого инструмента/языка)?
    Вы не привели какой-либо конкретной информации, которая позволила бы вам помочь решить проблему.
     
    Вопросы нужно задавать следующими образом. Есть текст такой-то. Нужно получить такой-то. Части текста, которые заведомо неизвестны, лучше выделить цветом. Регулярки работают с тем, что известно, чтоб найти то, что не известно.
    Желательно указать редактор/язык программирования, т.к. диалекты различаются.
     
    Если имеются какие-то более комплексные задачи - смотрите и задавайте вопросы в соотв. ветках (TextPipe, PowerGREP, скриптовые языки и т.д.).
    Здесь тема только по регулярным выражениям.

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 12:26 14-01-2019
    VadKomarov



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

    Цитата:
    Парсить что? HTML? Или буфер обмена копированного со станицы текста?

    Все варианты можно рассмотреть как html так и буфер, но буфер предпочтительней.
     
    вообще регулятки отрабатываются через RegEx в Delphi

    Код:
     
    ...
    Reg := TRegEx.Create(masshab[k],[roIgnoreCase, roMultiLine]);
      if Reg.IsMatch(form1.Memo2.Lines.Text) then
      begin
        M:=Reg.Matches(form1.Memo2.Lines.Text);
    ...
    for j := 1 to m[i].Groups.Count-1 do begin
           form1.Memo2.Lines.Add(M[i].Groups.Item[j].Value);
    ...
     

     
    В общем программулина которая следит за памятью и если находит в ней текст который можно отработать каким нибудь регулярным выражением (которые храняться в файле/ах) то програмулина отрабатывает и помещает обратно в буфер уже преобразованные данные.
     
    к примеру есть какой то текст который можно выбирать  


    01.02.2000 - http//....
    Тут какой то текст и т.д.
    02.02.2001 - http//.....
    Тут какой то текст и т.д
    ....


    и надо отработать такой текст и в память положить такой результат:


    ПРОВЕРКА ПРОВОДИЛАСЬ 01.02.2000 г. по адресу http//.....
    ПРОВЕРКА ПРОВОДИЛАСЬ 01.02.2001 г. по адресу http//.....
    ....


     
    Регулярные выражения и результаты храняться в таком виде:
    ПРИМЕР:Файл с регулярками
     
    Все это в программе можно выбирать.... и пока хватало...
    но возникла необходимость отрабатывать данные с сайта (пока что связано с расписанием) поездов.
     
    и надо регулярку или вариант решения подобной задачи.

    Всего записей: 100 | Зарегистр. 01-05-2005 | Отправлено: 13:22 14-01-2019
    Jonmey

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

    Цитата:
    вариант решения подобной задачи

    Вам нужен, как я понял, однокнопочный вариант решения, поскольку в противном случае иной метод для работы с частными страницами не выиграет ни  по времени, ни в количестве телодвижений по сравнению с предложенным мною ранее (одно нажатие пиппы, выделение нужного и копирование в буфер). Далее делайте, что угодно с буфером (поскольку имеете набор строк с делимитерами и без тегового мусора), например, clipboardfusion поддерживает навороченные макросы (C# или VB .NET) работы с буфером (включая, разумеется пресловутые регэкспы) - редактируйте, сохраняйте и т.д. автоматом, написав соответствующий хотелкам макрос).
     
    В общем проблема надуманная, и лично мне представляется, что реальной проблемой в данном случае является задача выдергивания нужных страниц с сайта (в лоб она решается перебором 17 млн. урлов или более). Если же нужны лишь отдельные расписания в ограниченном количестве, то это разговор ни о чем, поскольку задачка копеечная и засорять мозги ею не стоит.
     
    Добавлено:
    Подробнее

    Всего записей: 1305 | Зарегистр. 17-01-2011 | Отправлено: 13:58 14-01-2019 | Исправлено: Jonmey, 16:14 14-01-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VadKomarov
    Теперь понятно.
    Пробовал с буфером обмена. Если нужны только строки с промежуточными станциями, то регулярка следующая:
     
    Найти:

    Код:
    ^\x20\t{2}((?:[^\r\n\t]+\t){5})\r?\n([^\r\n\t]+)

     
    Заменить:

    Код:
    \1\t\2

    Выставьте флаг "символ ^ находит начало строки" - не знаю, как с этим в Delphi.
     
    Если требуется первый пункт и пункт назначения, то могут быть варианты. Лучше сделать отдельной регуляркой, если есть такая возможноть. Если нет, то надо усложнять эту. Например так:
     
    Найти:

    Код:
    ^\x20\t{2}((?:[^\r\n\t]+\t{3}(?:[^\r\n\t]+\t){2}|(?:[^\r\n\t]*\t){5})$)(?:\r?\n(?=\d)([^\r\n\t]+)|$)

     
    Заменить то же.
    Ещё раз, должны быть вставлены флаги "^$ match at line breaks", хотя можно указать в самой регулярке так:
     

    Код:
    (?m:^\x20\t{2}((?:[^\r\n\t]+\t{3}(?:[^\r\n\t]+\t){2}|(?:[^\r\n\t]*\t){5})$)(?:\r?\n(?=\d)([^\r\n\t]+)|$))

     
    Проверил другую страницу с расписанием - вроде работает.

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 14:12 14-01-2019
    Baltazar500



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть текст
    Код:
    ('10','10','20')
    <span style="color:#4b4b4b">aaa bbb ccc ddd </span>
    <br />(aaa bbb ccc 123)</nobr>
    и в нём надо найти текст обратный "<.+?>" (lazy/non-greed). Всё пытаюсь инвертировать это выражение, но с negative look-ahead (?!) у меня дела туго идут, либо я вообще не в ту сторону смотрю.

    Всего записей: 2078 | Зарегистр. 19-09-2011 | Отправлено: 06:52 21-01-2019
    Romul81



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

    Цитата:
    и в нём надо найти текст обратный "<.+?>" (lazy/non-greed).

    Вы не совсем ясно объяснили. Тем не менее попробую ответить.
    Просто так, только в рамках регулярных выражений, инвертировать не получится. Нужна программная логика. Она легко реализуется в том же TextPipe, к примеру. Не говоря уже о языках программирования. Парсить HTML регулярками вообще дело неблагодарное. Для этого существуют специализированные инструменты.
    Максимум, что вы можете сделать, основываясь на этом примере, это первым проходом удалить HTML-теги. Следующей регуляркой:

    Код:
    </?[a-z][a-z0-9]*[^<>]*>

    Останется нужный вам контент.

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 12:36 21-01-2019
    Baltazar500



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81,
    Цитата:
    Вы не совсем ясно объяснили.
    тут был интерес в возможности инвертирования данной регулярки для поиска значений обратной ей, дабы grep'ом через -oP выцепить всё, что мне было нужно. Ну ежели так нельзя, значит буду sed'ом по вашей регулярке (спасибо, лишний раз голову ломать не буду).
    Цитата:
    Парсить HTML регулярками вообще дело неблагодарное.
    Да я в курсе Но тот сайт статичен и изменений на нём не предвидится в принципе, так что всё ОК.
    Цитата:
    Для этого существуют специализированные инструменты.
    Порывался разобраться с этим делом и наставил кучу tool'ов, но а итоге понял, что на разборки с ними уйдёт прорва времени для задачи, которая всплывает раз в 2-3 месяца.

    Всего записей: 2078 | Зарегистр. 19-09-2011 | Отправлено: 21:09 21-01-2019
    Nikolai2004



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    в документации текстового редактора EmEditor написано, что он использует Boost library Regex++.
    хочу под него настроить RegexBuddy 4.5, но в нем нет такой разновидности (flavor) регулярных выражений.
    я вот нашёл целую таблицу как Boost отличается от std::regex, JavaScript и Perl. кто-нибудь может помочь?
     
    Добавлено:
    update: блин, заглянул на оф.сайт, уже есть более новая RegexBuddy 4.9, где добавлена разновидность Boost. вопрос снимается

    Всего записей: 1523 | Зарегистр. 07-01-2004 | Отправлено: 22:06 22-01-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Nikolai2004
     
    Дык это, вопрос не так прост на первый взгляд... Boost - это библиотека, написанная на языке С++.
    В том же RegexBuddy для этой библиотеки имеется 7(!) диалектов. Какой конкретно используется в EmEditor для меня вопрос.
     
    Но это ещё не всё. С версии 15.7 в EmEditor появилась поддержка альтернативного движка - Onigmo, который мне лично кажется более симпатичным. Его синтаксис можно найти как в справке самого EmEditor, так и в репозитории проекта.
    В RegexBuddy вы можете составлять совместимые регулярки, выбрав синтаксис ...Ruby
    Да, этот язык программирования использует библиотеку Onigmo в качестве движка регулярных выражений.
    А вообще, это одно семейство - Perl/PCRE/Boost/Onigmo и многие другие, которые повторяют синтаксис Perl с некоторыми (не)значительными отличиями. Вряд ли вам попадётся ситуация, когда бы потребовалась регулярка, в которой эти отличия имели бы значение. Это, надо сказать, достаточно продвинутый уровень, где важны подобные нюансы. Очень многие программисты даже не тратят время на освоение всех тонкостей и премудростей регэкспов. Сложную логику проще реализовать программно.
     
    Возвращаясь к движкам. Самым главным недостатком всех перло-подобных диалектов, на мой взгляд является отсутствие такой вещи как Variable-length look-behind. В том числе и поэтому EmEditor-ом я не пользуюсь. EditPad с его собственным движком выгодно отличается в этом плане. Хотя, ничего идеального нет, конечно...

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 00:24 23-01-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

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


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru