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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    extrasensory 18:52 26-03-2018
    Цитата:
    В идеале, конечно хотелось одним махом навести порядок и привести к нужному виду текст в части пунктуации по средствам регулярных выражений

    Опять таки просто для примера, в какую сторону двигаться

    Код:
    Удалить лишний пробел перед ! и запятой , и закрывающей скобкой ) и точкой . Новое предложение .
    Добавить пробел после скобки)слово с маленькой буквы.


    Код:
    ((\l) (\!|,|\)|\.))|(\))(\l)
    на
    Код:
    (?1$2$3:)(?4$4 $5:)

     
    Добавлено:
    Я бы на вашем месте регулярки тут раздел бы три группы.  
    1) Где надо убрать пробел.
    2) Где надо добавить пробел после символа.
    3) Где надо добавить пробел перед символов.
     
    Варианты внутри группы перебрать через | ((по аналогии, как сделано в регулярке в моей предыдущем посте). А эти три группы потом опять объединил бы уже по аналогии как в этом посте объединена первая и вторая группа.

    ----------
    Раздачи и акции

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 20:41 26-03-2018
    extrasensory

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regist123, спасибо, что возитесь со мной. Но, как ни стараюсь, не могу объединить ваши примеры в один, всё какая-то ерунда выходит.
    ПРобую на тексте (текст конечно просто для теста):
     

    Цитата:
    Проверка,расстановки . Знаков( препинания ) ,если знаки препинаются .Да , если : препинаются !Очень;(сильно)препинаются ?Да,очень , сильно !

     Что-то такое выходит, но не работает, а где, понять не могу.

    Код:
    ((\l) (\!|,|\)|\.|\:|\?|\;))|(\))(\l)|(\l) \.|(\l) ,|\.(\u)|,(\l)|&(\S)|(\l) \.|(\l) ,
    (?1$2$3:)(?4$4 $5:)(?6$6\.:)(?7$7,:)(?8. $8:)(?9, $9:)(?{10}& ${10}:)(?{11}${11}\.:)(?{12}${12},:)

    Всего записей: 40 | Зарегистр. 07-11-2009 | Отправлено: 20:01 27-03-2018 | Исправлено: extrasensory, 20:02 27-03-2018
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    extrasensory, нет возможности сейчас детально вникнуть в вашу регулярку и поправить. А так сходу видно, что у вас скобки пропущены. В нижнюю часть замены пока не вникал (да и нет смысла пока выражение для поиска не исправлено).
    Выше предложил вам разбить на три группы. Вот смотрите первая группа у вас
    Код:
    ((\l) (\!|,|\)|\.|\:|\?|\;))
    она у вас взята в скобки (и работает правильно, для теста можно удалить всё справа от неё и проверить). Точно также надо взять и остальные группы. А сейчас у вас там не пойми что. И для отладки (если не получается понять почему не работает), то упрощайте выражение до более простого - дорабатывайте, а уже потом эти составные части складывайте в более сложное. То есть если вы за основу возьмёте предложенный мной алгоритм, то для начала у вас должно получиться три отдельных регулярки, а потом уже их надо будет сложить. Можете пока составить и отладить эти три регулярки?

    ----------
    Раздачи и акции

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 23:03 27-03-2018
    extrasensory

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regist123, так я ровно по этому принципу и пытался сделать. Тут и есть три группы, три отдельных регулярки, которые по отдельности работают
    1. Удаляем лишние пробелы перед знаками:

    Код:
    ((\l) (\!|,|\)|\.|\:|\?|\;))
    (?1$2$3:$4$5?$6;:)

    2. Добавляем пробелы после символов: (после точки в конце предложения и после запятой в середине предложения):

    Код:
    \.(\u)|,(\l)|&(.)  
    (?1. $1:)(?2, $2:)(?3& $3:)

    Создать один блок для всех случаев "добавить пробел ПОСЛЕ '?' '!' не смог, по отдельности, работают, а в один блок не понимаю:

    Код:
    \?(\u)
    (?1? $1:)


    Код:
    \!(\u)
    (?1! $1:)

    3. Добавить пробел перед символами: Насколько я понимаю, необходим только один вариант, "пробел перед открывающей скобкой, если его нет".  У меня выходит приерно так:

    Код:
    \((\l)
    (?1 \($1:)

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

    Всего записей: 40 | Зарегистр. 07-11-2009 | Отправлено: 08:13 28-03-2018 | Исправлено: extrasensory, 08:45 28-03-2018
    ne_viens

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

    Код:
    ((\l) (\!|,|\)|\.|\:|\?|\;))

    Лишние скобки нам не надо:

    Код:
    (\l) (\!|,|\)|\.|\:|\?|\;)

    , потом труднее их считать будет.
     

    Код:
    \.(\u)|,(\l)|&(.)
    (?1. $1:)(?2, $2:)(?3& $3:)

    Тут что-то нагорожено, надо: (?1$1$2:)
     

    Код:
    \?(\u)
    (?1? $1:)
    \!(\u)
    (?1! $1:)

    Эти можно добавить к .,&

    Код:
    \.(\u)|,(\l)|&(\S)|\!(\u)|\?(\u)
    (?1. $1:)(?2, $2:)(?3& $3:)(?4! $4:)(?5? $5:)

     

    Код:
    \((\l)
    (?1 \($1:)

    Тут написано искать скобку "\(" с последующей малой буквой "(\l)" и букву запомнить.
    Eсли последовательность найдена "?1", заменить на пробел, скобку и сохранённую букву " \($1:"
    A надо искать малую букву и скобку и букву запомнить "(\l)\(" ,
    потом заменить на сохранённую малую букву, пробел и скобку "(?1$1 \(:)"  
     
    Осталoсь только объединить регексы через оператор ИЛИ "|"
    и в строке условной замены разобраться с нумерацией переменных в соответствии с скобками из регекса.

    Код:
    (\l) (\!|,|\)|\.|\:|\?|\;)|\.(\u)|,(\l)|&(\S)|\!(\u)|\?(\u)|(\l)\(
    (?1$1$2:)(?3. $3:)(?4, $4:)(?5& $5:)(?6! $6:)(?7? $7:)(?8$8 \(:)

    И, если хочется совсем правильно, то строку замены пишем по логике "if, else if, else if, ..." , а не по "if, if, if, ..."

    Код:
    (?1$1$2:(?3. $3:(?4, $4:(?5& $5:(?6! $6:(?7? $7:(?8$8 \(:)))))))

    , правда от этого сильно пострадает читаемость.
     

    Всего записей: 1569 | Зарегистр. 01-11-2004 | Отправлено: 10:49 28-03-2018 | Исправлено: ne_viens, 10:52 28-03-2018
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ne_viens хотел немного оптимизировать ваше выражение. Регулярку для добавления пробела перед большой буквой переделал так
    Код:
    ((\.|\!|\?)(\u))
    и она работает. А когда объединяю её с выражением для удаления пробела, то есть получаю
    Код:
    ((\l) (\!|,|\)|\.|\:|\?|\;))|((\.|\!|\?)(\u))
    то поиск большой буквы перестаёт работать. Не могу понять, где у меня ошибка?  
     
    Add.
     
     extrasensory 19:57 29-03-2018
    Цитата:
    Регулярное выражение применено первый раз:  

    Похоже та же ошибка с регуляркой, что и у меня. Проверил, если мою регулярку также прогнать два раза. Для замены использовать
    Код:
    (?1$2$3:)(?4$5 $6:)
    то тоже со второго раза отрабатывает. Похоже на глюк самого Npp.
    Может знаете какой-нибудь удобный тестер регулярок для perl где можно было их проверить?

    ----------
    Раздачи и акции

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 18:43 29-03-2018 | Исправлено: regist123, 22:24 29-03-2018
    extrasensory

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ne_viens! Огромная вам благодарность! Вторые сутки сижу разбираюсь, этого материала мне надолго хватит, может и получится не просто понять, что к чему, но и научиться пользоваться! Спасибо вам!
    Жаль, правда, что итоговое выражение всё равно не исправляет пунктуацию, приводя её в максимально правильное состояние. Вот, как получается у меня:
    Исходное состояние:

    Регулярное выражение применено первый раз:  

    Регулярное выражение применено второй раз:

    Может быть и невозможно "за один присест" исправить всю пунктуацию.

    Всего записей: 40 | Зарегистр. 07-11-2009 | Отправлено: 18:57 29-03-2018
    extrasensory

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста, имеются файлы такого вида:
     
    89915204325261714819778_03_05_2018-03_05_2018.gpx
    89915204325261714819778_04_05_2018-04_05_2018.gpx
    89915204325261714819778_08_05_2018-08_05_2018.gpx
     
    как должно выглядеть регулярное выражение для переименования в Total Commander, что-бы получилось:
     
    2018-05-03.gpx
    2018-05-04.gpx
    2018-05-08.gpx

    Всего записей: 40 | Зарегистр. 07-11-2009 | Отправлено: 11:39 10-05-2018
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    extrasensory
    может кто более изящное решение предложит, а пока так

    Код:
    \d+_\d\d_\d\d_(\d{4})-(\d\d)_(\d\d)_\d{4}

    на

    Код:
    $1-$2-$3

    Подробнее...


    ----------
    Раздачи и акции

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 12:01 10-05-2018 | Исправлено: regist123, 12:34 10-05-2018
    YuS_2



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

    Цитата:
    как должно выглядеть регулярное выражение для переименования в Total Commander, что-бы получилось:

    Варианты, есть конечно, но я бы сделал так:
    [v] рег.выраж.
    остальные "птицы" выключить
    Найти:

    Код:
    ^[\d_]+-(\d{2})_(\d{2})_(\d{4})

    Заменить на:

    Код:
    $3-$2-$1

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 12:23 10-05-2018
    Jonmey

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

    Цитата:
    Подскажите пожалуйста, имеются файлы такого вида:  
     
    89915204325261714819778_03_05_2018-03_05_2018.gpx  
    89915204325261714819778_04_05_2018-04_05_2018.gpx  
    89915204325261714819778_08_05_2018-08_05_2018.gpx  
     
    как должно выглядеть регулярное выражение для переименования в Total Commander, что-бы получилось:  
     
    2018-05-03.gpx  
    2018-05-04.gpx  
    2018-05-08.gpx

    Если требуемые цифры/символы для составления нового имени файла занимают в исходных файлах одни и те же позиции, то регэкспы не нужны.
    Достаточно использовать маску ("Rename mask: file name"), например
     
    [N31-35][N28-29]-[N25-26]
     
    (кнопка "[N#-#] Range" поможет сделать это в визуальном режиме)

    Всего записей: 1376 | Зарегистр. 17-01-2011 | Отправлено: 12:51 10-05-2018
    YuS_2



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

    Цитата:
    Если ..., то регэкспы не нужны.

    осталось только выяснить, зачем тогда здесь (в данном топике) нужен этот ответ?

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 14:01 10-05-2018
    Jonmey

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

    Цитата:
    осталось только выяснить, зачем тогда здесь (в данном топике) нужен этот ответ?


    Цитата:
    для переименования в Total Commander

    обладающего специфическими возможностями переименования, которые позволяют решать многие вопросы переименования без использования регулярных выражений, в том числе и такие, при которых регулярные выражения бессильны, и что, как показывает опыт, часто, даже неизвестно пользователям TC.
    Хотя сама по себе указанная выше возможность равносильна простейшей замене (но, в отличие от нее удобнее и проще в применении), типа:
     
    Заменить:
    ........................(..).(..).(.....)..........  
     
    или то же, но короче (и менее наглядно):
     
    .{24}(.{2}).(.{2}).(.{5}).{10}
     
    На:  
     
    $3$2-$1
     
    (для случая, когда символы, нужные для составления нового имени занимают в именах файлов одни и те-же положнения)
     
    На мой скромный взгляд метод

    Цитата:
    Достаточно использовать маску ("Rename mask: file name"), например  
     
    [N31-35][N28-29]-[N25-26]  
     
    (кнопка "[N#-#] Range" поможет сделать это в визуальном режиме)

    проще и и быстрее в использовании в данном конкретном случае.
     
    Мне казалось, что эти очевидные вещи не потребуют дополнительного разжевывания.

    Всего записей: 1376 | Зарегистр. 17-01-2011 | Отправлено: 21:10 10-05-2018 | Исправлено: Jonmey, 22:00 10-05-2018
    extrasensory

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regist123, YuS_2, Jonmey - Огромное, огромное спасибо! Все варианты рабочие. Честно говоря, до последнего стараюсь не спрашивать, понимая, что наверняка отправят к Гуглу, но я то "там" уже набродился и когда ну совсем не могу понять тогда да, только тогда и обращаюсь и на примере этой темы, ничего лич(ш)него не слышал, только реальная помощь, а еще (и в большей степени) мне эти ответы помогаю разбираться дальше, по аналогии. В сети хоть и всё есть и может (кто уже разбирается) кажется всё разжеванно, но всё не так доходчиво и примеры очень простые что-ли, которые понятны, а вот что-то более сложно и сразу наезжаю на пень, а эти три варианта мне очень сильно помогли, смог понять принцип и составил для схожих задач нужные выражения. Ёще раз большое спасибо!
     
     
     
     
    Добавлено:

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

    Jonmey, Вы правы! Именно тот случай, я и не знал о такой возможности! Спасибо. (прошу прощения, что немного за рамки регулярных выражений вышел)
     

    Всего записей: 40 | Зарегистр. 07-11-2009 | Отправлено: 00:11 11-05-2018
    YuS_2



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

    Цитата:
    Мне казалось

    Не знаю, чего там показалось, но ключевыми были слова:

    Цитата:
    в данном топике

    и Ваше:

    Цитата:
    то регэкспы не нужны


    - обратите внимание на название темы, если я не совсем понятно выразился.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 09:06 11-05-2018
    Jonmey

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

    Цитата:
    Jonmey

    Цитата:
    Мне казалось

    Не знаю, чего там показалось, но ключевыми были слова:

    Цитата:
    в данном топике

    и Ваше:

    Цитата:
    то регэкспы не нужны


    - обратите внимание на название темы, если я не совсем понятно выразился.
    Напомню, мое сообшение было ответом на конкретный вопрос вопрос пользователя.
    Который подтвердил его нужность.
     
    Если вас что-то не устраивает - есть кнопка "Cообщить модератору". В остальном, смысл ваших сообщений адресованных мне, уловить не в состоянии, кроме очевидного нарушения п. 2.16. главы VIII Соглашения по использованию.

    Всего записей: 1376 | Зарегистр. 17-01-2011 | Отправлено: 10:13 11-05-2018 | Исправлено: Jonmey, 10:15 11-05-2018
    YuS_2



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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:05 11-05-2018
    abitip35pro9600gt



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет. Прошу помощи.
    Можно ли сделать последовательную замену одной командой?
    Т.е. отдельно делаю поиск и замену, скажем
    найти 1
    заменить 2
     
    найти 3
    заменить 1
     
    найти 2
    заменить 3
     
    Спасибо.

    Всего записей: 17 | Зарегистр. 10-11-2010 | Отправлено: 18:09 07-06-2018
    Mavrikii

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    abitip35pro9600gt
    Одной - нет (не рег выражениями - в php, к примеру, есть strtr)

    Всего записей: 15557 | Зарегистр. 20-09-2014 | Отправлено: 18:43 07-06-2018
    abitip35pro9600gt



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    И notepad++ не поможет?

    Всего записей: 17 | Зарегистр. 10-11-2010 | Отправлено: 18:58 07-06-2018
    Открыть новую тему     Написать ответ в эту тему

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