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

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

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

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)
  • Игра - Регулярно выражайтесь!
     
    первое сообщение темы...
    Обсуждение шапки данной темы ведётся в этой теме
    Рекомендации по составлению вопросов в данной теме:

  • Всего записей: 32 | Зарегистр. 07-04-2002 | Отправлено: 23:55 15-10-2002 | Исправлено: totnetot, 00:38 08-01-2020
    usalex

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

    Код:
    "https://4pda.ru","Locus","Figocus",,"","{d190069}","159456","159456","15945685"

     
    Нужно во всех этих строках удалить "хвосты", начиная от третьей по счету запятой и до конца строки. Эту третью по счету запятую нужно тоже удалять.
    Чтоб получились строки вида:

    Код:
    "https://4pda.ru","Locus","Figocus"

     
    Можно ли так сделать?

    Всего записей: 4666 | Зарегистр. 20-12-2004 | Отправлено: 19:26 14-07-2020
    VitRom

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    например (.*,.*,.*),.*  или  (.*?,.*?,.*?),.*  =>  \1  или  $1

    Всего записей: 2775 | Зарегистр. 18-06-2006 | Отправлено: 19:46 14-07-2020 | Исправлено: VitRom, 20:03 14-07-2020
    usalex

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VitRom
    Спасибо.
    Попробовал в Notepad++
    Нужного результата добился, но пришлось жать кнопку "Заменить всё" многократно (шесть раз). За одно нажатие почему-то не удаляется весь хвост.
     
    upd
    За шесть нажатий - это если использовать звездочки.
    А если использовать знаки вопроса, то все хвосты удаляются за одно нажатие.
    СПАСИБО

    Всего записей: 4666 | Зарегистр. 20-12-2004 | Отправлено: 20:04 14-07-2020 | Исправлено: usalex, 20:07 14-07-2020
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    можно так
    ^(("[^"\n\r]*",){2}"[^"\n\r]*")[^\n\r]*$
    заменить на
    $1

    Всего записей: 1154 | Зарегистр. 17-01-2011 | Отправлено: 02:38 15-07-2020
    usalex

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Jonmey
    Да, так тоже работает (с первого нажатия).
    Спасибо.
    А что дало (чем лучше?) такое усложнение цепочки поиска?

    Всего записей: 4666 | Зарегистр. 20-12-2004 | Отправлено: 04:19 15-07-2020
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вроде бы, тут ещё не было.
    Возможно, кому пригодится: gram_grep

    Цитата:
    Search text using a grammer, lexer, or straight regex. Chain searches for greater refinement.

    Собрать можно так:

    Код:
     
    git clone https://github.com/BenHanson/parsertl14.git
    git clone https://github.com/BenHanson/lexertl14.git
    git clone https://github.com/BenHanson/wildcardtl.git
    git clone https://github.com/BenHanson/gram_grep.git
     
    cd gram_grep
     
    g++ -O2 -std=c++17 -o gram_grep main.cpp
     

     
    В папке sample_configs есть несколько примеров конфигов.

    ----------
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1566 | Зарегистр. 13-10-2005 | Отправлено: 14:22 16-07-2020
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Понадобилось тут выделить из текста вида "2-1656/2019 22.08.19" номер без даты.  
    Для выделения первой части до пробела сейчас использую аргумент функции =RegexExtract() "([\-\/\d]*?) " В большинстве случаев номер извлекается корректно, но если 2 пробела и больше - в конце извлечённого фрагмента откуда ни возьмись появляются запятые. Может есть более универсальный паттерн, устойчивый к криворукости оператора? Если важно, это всё происходит в Excel.

    Всего записей: 956 | Зарегистр. 17-04-2007 | Отправлено: 10:37 17-07-2020
    Mavrikii

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

    Цитата:
    в конце извлечённого фрагмента откуда ни возьмись появляются запятые

    скорее возвращается массив с пустыми элементами, которые перечисляются через запятую.
    функция не является стандартной, эта реализация?
    https://stackoverflow.com/questions/7086270/how-to-extract-text-within-a-string-of-text
    попробуйте просто "([\-\/\d]+)"

    Всего записей: 9517 | Зарегистр. 20-09-2014 | Отправлено: 13:17 17-07-2020 | Исправлено: Mavrikii, 13:18 17-07-2020
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mavrikii
    О благодарю, теперь всё отлично! и кол-во пробелов не влияет.
    Пользовательская функция да, та самая

    Всего записей: 956 | Зарегистр. 17-04-2007 | Отправлено: 17:43 17-07-2020
    Jonmey

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

    Цитата:
    А что дало (чем лучше?) такое усложнение цепочки поиска?

    - Быстрее работает
    - Устойчивость к неправильному включению lazzy/greedy режимов поиска
    - Нечувствительность к типам конца строк (pc, mac, unix)

    Всего записей: 1154 | Зарегистр. 17-01-2011 | Отправлено: 22:05 18-07-2020
    NeoAnomaly

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеются имена файлов вида:
     

    Цитата:
     
    213890-0_1.2.45_03452647M_D_M_02.2020_0001.xls
    134-0_1.9.5_03452123Y_CAP_M_03.2020_0001_empty.xlsx
    32490902374-1.8.3_03452773_K_M_01.2020.xls
     

     
    Необходима регулярка для разбиения этого имени на части. Паттерн 03452\d{3} - это код формы, содержащейся в файле.
     
    Первая группа должна содержать все символы и код формы включительно, извлекаю таким образом:

    Код:
     
    (?'firstPart'.*03452\d{3}.*?_)
     

     
    Получаю:

    Цитата:
     
    213890-0_1.2.45_03452647M_
    134-0_1.9.5_03452123Y_
    32490902374-1.8.3_03452773_
     

     
    Вторая часть должны содержать все оставшиеся символы за исключением паттерна: _000\d  
    т.е.

    Цитата:
     
    D_M_02.2020.xls
    CAP_M_03.2020_empty.xlsx
    K_M_01.2020.xls
     

     
    Сейчас задача решается в несколько подходов, т.е. разбили на 2 части из 2-й удалили лишнее. Но можно ли написать регулярное выражение, которое просто возвращает 2 интересующие группы?

    Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 15:55 30-07-2020
    VVL99



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

    Цитата:
    в несколько подходов
    А в какой среде всё действо происходит?

    Код:
    /(.*?03452\d{3}.*?_)(.*_._\d{2}\.\d{4}?)(_.*?|)(_.*?|)(\..*)/

    Код:
    var a = "134-0_1.9.5_03452123Y_CAP_M_03.2020_0001_empty.xlsx".match(/(.*?03452\d{3}.*?_)(.*_._\d{2}\.\d{4}?)(_.*?|)(_.*?|)(\..*)/)

    Цитата:
    ["134-0_1.9.5_03452123Y_CAP_M_03.2020_0001_empty.xlsx", "134-0_1.9.5_03452123Y_", "CAP_M_03.2020", "_0001", "_empty", ".xlsx"]

    Код:
    a[1] + " - " + a[2] + a[4] + a[5]

    Цитата:
    "213890-0_1.2.45_03452647M_ - D_M_02.2020.xls"
     
    "134-0_1.9.5_03452123Y_ - CAP_M_03.2020_empty.xlsx"
     
    "32490902374-1.8.3_03452773_ - K_M_01.2020.xls"

    Всего записей: 3576 | Зарегистр. 03-02-2011 | Отправлено: 19:12 30-07-2020
    NeoAnomaly

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99, среда .net. Предложенный вариант работает - буду осмыслять ) Спасибо!

    Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 10:20 31-07-2020
    YuS 2



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

    Цитата:
    среда .net.

    powershell, для которого .net родная среда

    Код:
    $arr = @(
    "213890-0_1.2.45_03452647M_D_M_02.2020_0001.xls"
    "134-0_1.9.5_03452123Y_CAP_M_03.2020_0001_empty.xlsx"
    "32490902374-1.8.3_03452773_K_M_01.2020.xls"
    )
    $arr|%{$_ -split "(?<=03452\d{3}.?_)"}

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

    Код:
    $arr|%{$a=$_ -split "(?<=03452\d{3}.?_)";$a[0] + ' - ' + $a[1]}

     

    Цитата:
    Вторая часть должны содержать все оставшиеся символы за исключением паттерна: _000\d

    а, совсем забыл про это условие...
    Последняя строка будет такой:

    Код:
    $arr|%{$a=$_ -split "(?<=03452\d{3}.?_)";$a[0] + ' - ' + ($a[1] -replace '_000\d')}

    Всего записей: 3006 | Зарегистр. 03-02-2009 | Отправлено: 12:59 31-07-2020 | Исправлено: YuS 2, 13:12 31-07-2020
    sikemo

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
      Тестирование регулярных выражений  
    WildGem 1.3
    [img=https://jurnsearch.files.wordpress.com/2019/05/wildgem.jpg][/img]
    A tool for building and testing ‘regular expression’ or ‘regex’ commands. Find and replace with these commands, and see the resulting changes (if any) in realtime. This software can hide some of the more common ‘regex’ snippets behind more user-friendly visual icons. Useful for instantly testing ‘regex’ command formulas you find, to see if they work, without having to wrestle with Notepad++. This is portable Windows software. In order to save your UI layout preferences, it must be run in Administrator mode.

    Всего записей: 1243 | Зарегистр. 27-11-2008 | Отправлено: 11:30 01-08-2020
    usalex

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

    Цитата:
    - Быстрее работает.....  

    Понял. Спасибо!
     
    А не могли бы подсказать по ещё одной задаче?
     
    В редакторе NPP есть возможность удалять дубликаты строк.
    Но мне не нужно их удалять, а нужно сначала пометить - сделать на этих строках закладки, чтоб запомнить в отдельный файл.
     
    Нельзя ли сделать какое-нибудь регулярное выражение для поиска дубликатов?

     
    Упс...
    Вроде, нашел вот здесь.
    Да, работает регулярное выражение:

    Код:
    ^(.*?)$\s+?^(?=.*^\1$)

    (не знаю, что оно означает... но работает )

    Всего записей: 4666 | Зарегистр. 20-12-2004 | Отправлено: 00:20 05-08-2020 | Исправлено: usalex, 02:19 05-08-2020
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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

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


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru