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

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

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regist123
    Слово или набор букв и цифр, которые подпадают под регулярку. Смотрите мои примеры выше.
     

    Цитата:
    не лучше заменить на  

    Можно заменить, но в чем разница? Вроде нету никакой разницы.

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 20:09 15-03-2017 | Исправлено: Hjkma, 20:10 15-03-2017
    sikemo

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    мне кажется, для варианта легче хэш удалять

    Всего записей: 1329 | Зарегистр. 27-11-2008 | Отправлено: 20:17 15-03-2017
    YuS_2



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

    Цитата:
    Если несколько из этих слов присутствуют в одной строке, то остается только одно из них, а остальные стираются.

    А как должно быть? Мне о том ничего неизвестно.
    Вам ведь правильно сказали:

    Цитата:
    Вы уж лучше пример дайте, как есть и нужный результат

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

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Поясню на примере, что не так в регулярке. Есть строки

    Цитата:
    D9QEnuQFohrxsgrlEVNsxvG4o1_1280 kate upton via mariux - reblog.jpg  
    KZSDLOZ2vkdq9r5usgul9pgUo1_1280 awesometits - reblog knocking-boots - reblog armageddon a film furshlugginer - reblog niceboobs - reblog mulher - reblog 1235552476009.jpg  
    iEkU592H9pvf2prrfy8n1sIKo1_1280 halo armageddon halo.jpg
    iEkU592H9pvf2prrfy8n1sIKo1_1280 kate upton kiss glamour hands on man.jpg  
    N4Fa7vzXdj11wl1iCnJbAoCPo1_1280 halo a game awesometits - reblog chagrin - reblog.jpg

    И есть регулярка с заданными словами "kate upton", "armageddon", "halo"

    Цитата:
    ^(.*?_1280\s).*?(kate upton|armageddon|halo)(.*-\sreblog)?.*(\..*)

    И такая регулярка превращает приведеные выше строки в:

    Цитата:
    D9QEnuQFohrxsgrlEVNsxvG4o1_1280 kate upton via mariux - reblog.jpg  
    KZSDLOZ2vkdq9r5usgul9pgUo1_1280 armageddon a film furshlugginer - reblog niceboobs - reblog mulher - reblog.jpg  
    iEkU592H9pvf2prrfy8n1sIKo1_1280 halo.jpg
    iEkU592H9pvf2prrfy8n1sIKo1_1280 kate upton.jpg  
    N4Fa7vzXdj11wl1iCnJbAoCPo1_1280 halo a game awesometits - reblog chagrin - reblog.jpg

    Видно, что в первой строке осталось слово "via", которое быть не должно, во второй строке слова "a film" тоже не должно быть, а в третей строке осталось только halo, а остальные заданные слова убрались, чего не должно быть, в четвертой строка регулярка удалила не нужные слова правильно, а в пятой строке остались "a film" чего же опять не должно быть.

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 08:51 16-03-2017
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hjkma
    Это уже не регулярные выражения, это скорее бессистемное удаление непонятных слов
    Вам необходимо выделить алгоритм, что должно остаться в строке (все возможные варианты), либо наоборот, что необходимо удалять из строки (опять же, все возможные варианты) - только в этом случае можно говорить о регулярных выражениях и пытаться составить какую-то более-менее рабочую регулярку...
     
    Поясню:
    Вот этих условий:

    Цитата:
    в первой строке осталось слово "via", которое быть не должно


    Цитата:
    во второй строке слова "a film" тоже не должно быть


    Цитата:
    в третей строке осталось только halo, а остальные заданные слова убрались, чего не должно быть

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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 10:45 16-03-2017
    Hjkma

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Должны остаться в строке только заданные слова, все остальные должны удаляться. Эти "via" и "a film" не являются заданными словами и должны удаляться. И навпротив заданные слова не должны удаляться и в том случае, если в строке присутствуют несколько из заданных слов. Думаю, я ясно обозначил цель, если что-то не ясно, спрашивайте еще раз по конкретнее.
     
    P..S. И кроме заданных слов, регулярка также не должна трогать первую часть строки, заканчивающую на _1280 и пробелом, слова стоящие перед " - reblog" и расширение файла в конце строк.

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 11:20 16-03-2017 | Исправлено: Hjkma, 11:31 16-03-2017
    YuS_2



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

    Цитата:
    Должны остаться в строке только заданные слова

    Где эти заданные слова?

    Цитата:
    Думаю, я ясно обозначил цель

    Это для Вас всё ясно, а вот для меня ... целиком условий Вы не показали, пример же - слишком частный случай, т.к. регэксп составлялся по Вашему первому примеру, а во втором - список заданных слов уже другой...
    В общем, учитывая все условия в такой именно постановке, эта задача не решается только регэкспами.  
    Тут придется сверять каждое слово со списком и удалять всё, что не подходит...
    Способов, конечно, больше, чем один...  
    Но, могу предложить простое решение с помощью AkelPad и встроенного скрипта SearchReplace.js
    [+] Регулярные выражения  
    [+] Зменять на функцию

    Код:
    Что:-? \b[^\s;,.]*\b
    Чем:var x = $0.toLowerCase(); if ( x == " kate" || x == " upton" || x == " armageddon" || x == " halo" || x == "- reblog"){return $0;} else {return "";}

     
    Ну и если ещё требуется оставить только один "- reblog" в конце имени файла, то можно дополнительной функцией это сделать:

    Код:
    Что:- reblog.
    Чем:var x = $0.toLowerCase(); if ( x == "- reblog."){return $0;}

     
    ЗЫ При копировании, не забываем о лишних концевых пробелах, их не должно быть

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 14:59 16-03-2017 | Исправлено: YuS_2, 15:10 16-03-2017
    Hjkma

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

    Цитата:
    Где эти заданные слова?  

    Список таких слов большой, порядка 2 тысяч штук слов и фраз, они всем вам точно нужны? Разве нельзя ли составить регулярку, в которую можно вписывать по свому собственному усмотрению слова с разделителем "|"?  

    Цитата:
    Но, могу предложить простое решение с помощью AkelPad и встроенного скрипта SearchReplace.js  

    А подойдет, если есть несколько заданных слов с пробелами? То есть не нужно отдельно оставлять слова "kate" и "upton", а только чтобы они вместе оставались.  

    Цитата:
     x == "- reblog"){

    Остается только "- reblog" или еще слово, которое идет перед? А если нет, то это не нужно.
     
    Upd. установил Akelpad, замена вроде ограничена 16 тыс. символами, так что не подходит, так как список слов большой, больше 50 тыс. символов.

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 15:23 16-03-2017 | Исправлено: Hjkma, 15:47 16-03-2017
    YuS_2



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

    Цитата:
    Список таких слов большой, порядка 2 тысяч штук слов и фраз, они всем вам точно нужны? Разве нельзя ли составить регулярку, в которую можно вписывать по свому собственному усмотрению слова с разделителем "|"?

    Да мне-то они не нужны... но 2000 слов в регэксп... это очень медленная процедура получится
     

    Цитата:
    То есть не нужно отдельно оставлять слова "kate" и "upton", а только чтобы они вместе оставались.

    Вот и ещё одно условие... говорю же, чтобы создать что-то правильно работающее, необходимо знать все условия, т.е. абсолютно.
     

    Цитата:
    Остается только "- reblog" или еще слово, которое идет перед? А если нет, то это не нужно.

    Составьте список, что же в итоге требуется...  
    Ну откуда мне знать, что какое-то слово остается только при наличии другого, а иначе удаляется? Вот откуда?
    Это у Вас информация есть, а вот у меня или у кого-то ещё, её просто нет... и кроме как от Вас, её получить негде.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:48 16-03-2017
    Hjkma

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Еще раз повторяюсь. Оставить нужно:
    1) первую часть строки, заканчивающую на _1280 и пробелом
    2) " - reblog" и набор букв и цифр, которые стоят перед " - reblog"
    3) заданные слова и фразы, это может быть одно слово или несколько слов. И если присутствуют несколько заданных слов в одном строке, нужно оставлять их всех, не удалять некоторые из них.
    4) точка и три буквы в конце строки (расширение файла).

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 16:10 16-03-2017 | Исправлено: Hjkma, 16:22 16-03-2017
    VVL99

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hjkma
    Действительно сложно понять алгоритм изменения.

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

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 16:40 16-03-2017 | Исправлено: VVL99, 16:43 16-03-2017
    Hjkma

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    Спрашивайте, что вам непонятно.

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 16:57 16-03-2017
    YuS_2



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

    Цитата:
    что вам непонятно.

    Как Вам сказать... непонятно всё
     
     16-03-2017

    Цитата:
    Еще раз повторяюсь. Оставить нужно:

    Если по пунктам, то п.п. 1), 2), 4) - особых сложностей не представляют, а вот в п. 3) нет никакой системы и следовательно нет никакой возможности выделить какой-либо алгоритм.
    Т.е. это выглядит примерно так: слова могут присутствовать в любом порядке, в любом количестве, кроме того, присутствуют не только слова, но и фразы из нескольких слов (два, три, четыре и т.д.), при этом, если присутствуют отдельные слова из фраз, их необходимо удалять. Никаких специальных разделителей фраз, либо слов, нет абсолютно. Да, можно было бы принять за разделитель пробел, но это противоречит условию о наличии фраз с пробелами... в общем, пойди туда - не знаю куда, найди то - не знаю что...

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 05:09 17-03-2017
    Hjkma

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

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

    То есть если к примеру есть заданные слова и фразы "word|count of lines|phrases" и есть строка:

    Цитата:
    Free word count software counting words, lines, pages, phrases, characters.

    то нельзя преобразовать в строку:

    Цитата:
    word phrases

    ?
     
    Добавлено:

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

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

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 10:32 17-03-2017
    YuS_2



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

    Цитата:
    то нельзя преобразовать в строку

    При условии, что неизвестно сколько вхождений слов/фраз в строке, при том, что необходимо их все оставить, а также неизвестно, что находится между ними, то чистыми регэкспами, в текстовом редакторе, это не сделать. Т.е., сделать-то это можно, но там уже, как минимум, необходимы возможности языков программирования...
    Ваш список замены можно попытаться реализовать, например, на powershell, но для этого необходимо свободное время, желание и удачно сложившиеся звезды... хотя последнее не обязательно

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 14:05 17-03-2017
    Hjkma

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Понятно. Изначально думал, что это решается с помощью регулярки. Ладно, спасибо за то, что уделили время.  
     
    Добавлено:
    Нашел все же выход, как удалить из текста все, что не соответствует поисковому запросу. Для этого скачиваем Sublime Text 3, строим из списка слов и фраз длинную регулярку с простым разделителем "|", запускаем поиск по этой регулярке, нажимаем на кнопку "найти все" и нажимаем на "Invert selection" в меню выделения и удаляем все выделенное и остаются только нужные слова и фразы. Всем спасибо за участие!

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 15:51 17-03-2017 | Исправлено: Hjkma, 16:23 17-03-2017
    YuS_2



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

    Цитата:
    это решается с помощью регулярки.

    В том числе и с помощью регэкспов...
     

    Цитата:
    Нашел все же выход

    Ну, раз уж решение найдено...  
    Кстати, а с большими объемами данных, проверена работа этого редактора?
    Тем не менее, может быть кому-нибудь ещё пригодится решение на powershell:
    script.ps1

    Код:
    $f_in='.\test.txt'
    $f_out='.\test-out.txt'
    $f_lst='.\test_compare.txt'
    if (test-path $f_out){del $f_out}
    $arr=gc $f_lst
     
    gc $f_in|%{
        $b=$null
        $a = $_ -replace "^(.*?_1280).*", '$1'
        $ext = $_ -replace ".*(\..*)", '$1'
        $arrind = @()
        foreach($str in $arr){
            if ($_ -match $str){
                $c=$_|sls "$str(\s*-\s*reblog)?" -allmatches
                for($i=0; $i -lt ($c.matches.length);$i++){
                    $arrind += @(
                        "$($c.matches[$i].index) $($c.matches[$i].value)"
                    )  
                }
            }
        }
        $a + " " + [string]$(
            $arrind|sort|%{$_ -replace "^\d+\s"}
        ) + $ext
    }|out-file -enc default $f_out

    где:  
    $f_in - путь и имя файла с данными
    $f_out - путь и имя выходного файла
    $f_lst - путь и имя файла со списком остающихся слов/фраз

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:28 17-03-2017 | Исправлено: YuS_2, 18:03 18-03-2017
    Hjkma

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    С большими объемами данных работа уже проделана, но все равно спасибо за скрипт и за то, что уделили свое время моей проблеме!

    Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 10:22 18-03-2017
    VVL99

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

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

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 17:46 22-03-2017 | Исправлено: VVL99, 18:56 22-03-2017
    VadKomarov



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Приветствую всех. Помогите разобраться или посоветуйте.
    в общем суть такая пишу процедуру на Delphi в ней есть переменные Reg: TRegEx; M: TMatchCollection; в которую помещаются данные и потом обрабатываясь этим куском кода выдает результат.

    Код:
     
    ...
    M:=Reg.Matches(form1.Memo2.Lines.Text);
    ...
    for j := 1 to m.Groups.Count-1 do begin
    text1:='{'+inttostr(j)+'}';
    text2:=M.Groups.Item[j].Value;
    while pos('  ',text2)>0 do text2:=StringReplace(text2,'  ',' ',[rfReplaceAll]);
    replstring:=StringReplace(replstring,text1,text2,[rfReplaceAll]);
    end;

     
    Регулярное выражение любое но к примеру Фамилия (.*)  Имя (.*)  \r\nОтчество (.*)  \r\nДата рождения:год (\d{1,4})  месяц (\d{1,2})  число (\d{1,2})   а выборка по группе происходит в таком выражении Работник {1} {2} {3} {6}.{5}.{4} года рождения
     
    Я можно сказать вообще не знаю регулярных выражений но большая просьба объясните можно ли  написать именно регулярное выражение таким образом что при выборе даты проверялось количество символов и в регулярном выражении добавлялся "0", а так же что бы Фамилия, Имя, Отчество сразу становились с заглавной буквы.


    Пример:
    Фамилия ИВАНОВ Имя ИВАН
    Отчество ИВАНОВИЧ
    Дата рождения:год 1900 месяц 1 число 15

    должно получиться:
    Работник Иванов Иван Иванович 15.01.1900 года рождения
    а сейчас выдаёт:
    Работник ИВАНОВ ИВАН ИВАНОВИЧ 15.1.1900 года рождения


     
    Если в чем то не прав то буду рад любым дельным советам.
    Заранее спасибо.

    Всего записей: 100 | Зарегистр. 01-05-2005 | Отправлено: 04:24 24-03-2017 | Исправлено: VadKomarov, 04:53 24-03-2017
    Открыть новую тему     Написать ответ в эту тему

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