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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Jonmey
    Да вы неадекват, похоже, с претензией на модераторские функции. Флейм до настоящего момента был только с вашей стороны. Адиос.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 14:13 04-02-2019
    YuS_2



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

    Цитата:
    В том же AkelPad её нет, если не ошибаюсь.

    есть уже...

    Цитата:
    (?(условие)шаблон-истина|шаблон-ложь)
    (?(условие)шаблон-истина)
    В случае успешного сопоставления условия, используется шаблон-истина, в противном случае шаблон-ложь (если он присутствует). Условие может быть шаблоном с положительным/отрицательным просмотром вперед/назад или номером обратной ссылки, которая будет проверяться на успешность совпадения. Например, '(a)?b(?(1)c|d)' соответствует "abc" в "abc" и "bd" в "zbd". Т.к., если "a" найдено, то ищется "c" после "b", если "a" не найдено, то ищется "d" после "b".  

     

    Цитата:
    Но почему правильнее?.. С точки зрения функционала - это то же самое (те же яйца, как говорится ).

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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 14:24 04-02-2019
    Romul81



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

    Цитата:
    есть уже...  

    Понятно, спасибо. Давно не пользовался этим редактором.

    Цитата:
    С точки зрения пошагового разбора регэкспов, "правильнее", т.к. они строго последовательны, т.е. захватываем символ, смотрим сразу же за ним вперед, если всё верно, переходим к следующему символу и т.д..

    :) я уже опасаюсь вступать в дискуссии, дабы не быть неправильно понятым. Постарайтесь, пожалуйста, воспринять нормально мою аргументацию.
    У меня есть понимание механизма последовательности, конечно. RegexBuddy и его дебаггер очень способствует этому пониманию. Поэтому, в случае моей регулярки никакого противоречия этому принципу нет. Смотрите сами:

    Код:
    ^w(?:(?!word)[^\r\n])*$

    находясь в позиции после первого захваченного символа w, (смотрю вперед -> захватываю)* и так много раз.
    Ваш вариант:

    Код:
    ^w(?!word)(?:[^\r\n](?!word))*$

    находясь в позиции после первого захваченного символа w, смотрю вперед -> (захватываю -> смотрю вперед)*
    принципиальной разницы нет вообще. Реализация полностью корректная и универсальная, соответствующая, как я уже сказал, паттерну из документации JGsoft (посмотрите примеры из библиотеки RegexBuddy).
     
     
    Добавлено:
    Нашёл в библиотеке:

    Цитата:
    Lines: Complete line NOT matched by the regular expression %REGEX%
     
    Explanation: Observe that the negative lookahead and the dot are repeated together.  This makes sure we test that %REGEX% fails at EVERY position in the string, and not just at any particular position.
     
    Tip: use alternation in %REGEX% to match a line that does not meet any of several requirements.  E.g. set %REGEX% to "one|two" (without the quotes), and the overall regular expression will match any line that does not contain either (or both) "one" or "two".


    Код:
    ^(?:(?!%REGEX%).)*$\r?\n?

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

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 14:41 04-02-2019 | Исправлено: Romul81, 14:41 04-02-2019
    YuS_2



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

    Цитата:
     я уже опасаюсь вступать в дискуссии, дабы не быть неправильно понятым.

    А не надо опасаться, если есть аргументация...
    Сразу оговорюсь, что согласен с тем, что ни в синтаксисе, ни в функционале, в данном случае, ошибок нет. Ибо мне сильно кажется, что дискуссия YuS_2 vs Romul81 протекает в ключе:
    - Вот, это белое!
    - Да нет же, это ведь белое!
     
    и не важно, кто и что утверждает...
     
    Всего лишь, высказал чисто субъективное мнение о наглядности просмотра вперед в регэкспе, для случая с многократно повторяемой группой.
    Да, подобрал не совсем подходящее для этого слово "правильно", каюсь, но править уже не буду, ибо смысл дискуссии точно исказится тогда.

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    я всегда за конструктив
    Давайте регулярно выражаться в конструктивном ключе!

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 15:31 04-02-2019
    gerxer

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    ГД это GoldenDict, и маты на форуме запрещены)

    Всего записей: 565 | Зарегистр. 19-06-2014 | Отправлено: 15:32 04-02-2019
    YuS_2



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

    Цитата:
    маты на форуме запрещены

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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:58 04-02-2019
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81
    а есть подобные дебагеры (желательно онлайн или портативные) для регулярок с синтаксисом типа PCRE ?

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 22:37 04-02-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regist123
    В шапке темы, в колонке Онлайн сервисы есть все необходимые ссылки. Правда я этими сервисами очень редко пользуюсь. Только, если, к примеру, надо расшарить регулярку с визуализацией её работы. Но чтоб так пошагово проследить, как это можно сделать в RegexBuddy, я таких сервисов не знаю. Может и есть. Походите по этим ссылкам, поэкспериментируйте...
     
    Добавлено:
    З.Ы. А что касается RegexBuddy, то он есть здесь в варезнике (кстати, недавно появилась свежая версия). В "родном" инсталяторе есть возможность установить программу портабельно. Поддержка синтаксисов широчайшая. В т.ч. и PCRE разных версий.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 22:47 04-02-2019
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81 написал(а)
    Цитата:
    чтоб так пошагово проследить, как это можно сделать в RegexBuddy

    да, речь была про это.
    Цитата:
    З.Ы. А что касается RegexBuddy, то он есть здесь в варезнике (кстати, недавно появилась свежая версия). В "родном" инсталяторе есть возможность установить программу портабельно. Поддержка синтаксисов широчайшая. В т.ч. и PCRE разных версий.

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

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 23:53 04-02-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regist123
    Сделал для примера визуализацию регулярки по корректному захвату DSL тегов.
    Из всего опробованного, результат понравился больше всего в:
     
    1) regex101.com В данном случае используется диалект JavaScript. Причём, сайт лояльно относится к заглядыванию назад переменной длины для этого языка. Это означает, что его хорошо поддерживают (сайт).
    "Объяснение", конечно не самое понятное. Но примерно так же оно оформлено в RegexBuddy. Для JavaScript дебаггера нет. Но он появляется, если выбрать диалект PCRE. Я чуть изменил регулярку, чтоб она стала совместимой с PCRE, с целью протестировать этот дебаггер. Сама регулярка стала из-за этого менее корректной, в плане логики, но для нас в данном случае это не важно. Ссылка - соотв. опция появляется слева в меню Tools. Очень прикольно организована анимация. Можно проследить как движется логика поиска в рамках регулярки. Пошагово.
    Тем не менее, ему (дебаггеру) далеко до такового из RegexBuddy. Дело в том, что на regex101 можно "отдебажить" только совпадения. Т.е. симуляция процесса идёт из позиции, где заблаговременно известно, что будет совпадение.
    Гораздо важнее для достижения лучшей эффективности дебажить позиции, в которых совпадения НЕТ! Именно там, как правило, происходит ад бэктрекинга. И задача дебаггера всё это отследить, чтоб составитель регулярки мог минимизировать все негативные моменты, связанные с бэктрекингом. Вот как раз с этим, RegexBuddy справляется в лучшем виде!
     
    2) debuggex.com. Сервис, конечно, не такой продвинутый. Да и, видно с поддержкой не ахти. При выборе JS, подсвечивает, якобы ошибку в look-behind. Т.е. сайт не в курсе, что так уже можно. Если поменять на PCRE, то ошибок не выдаёт, чем я и воспользовался. Хотя, строго говоря, эта регулярка в PCRE работать не будет (по причине того самого заглядывания назад переменной длины). Ну да ладно. Ценность этого сервиса в другом - в наглядном/графическом представлении регулярного выражения. Очень прикольно наблюдать все эти разветвления в виде блок-схемы.
    Вероятно, это может помочь многим понять те или иные нюансы регэкспов.
    Дебаггер на этом сервисе, понятное дело, никакущий. Я так и не понял, как он работает. В любом случае, тестированная регулярка не могла быть использована в рамках PCRE. А для JS сам сервис её "запретил" . Главное, как я уже сказал, на этом сервисе - визуализация.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 12:52 05-02-2019
    sikemo

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    как из строки типа  
     
     
    * Romansch: {{t|rm|glogn}}, {{t|rm|glonda}}, {{t|rm|glànd}}, {{t|rm|glanda}}
     
    сделать  
     
    |rm= {{t|rm|glogn}}, {{t|rm|glonda}}, {{t|rm|glànd}}, {{t|rm|glanda}}
     
    у меня  
    Find: ^.+\:\s\{\{(t\+?)\|(.+?)
    Replace: |\2={{\1|\2|}
     
    чуть лажает
     
    ---
    Подробнее...
     
     
     
     
     
     
    Добавлено:
    {{t или {{t+
     
    Добавлено:
    вроде как
    Find: ^.+?(t\+?)\|(\w+?)
    Replace: |\2= {{\1|\2

    Всего записей: 1329 | Зарегистр. 27-11-2008 | Отправлено: 16:11 07-03-2019
    Romul81



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

    Код:
    ^[^\r\n:]+:\s*(?={{t\+?\|(\w+\b)\|)

     
    Replace:

    Код:
    |$1=  

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 18:42 07-03-2019
    YuS_2



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

    Цитата:
    как из строки типа  
     
     
    * Romansch: {{t|rm|glogn}}, {{t|rm|glonda}}, {{t|rm|glànd}}, {{t|rm|glanda}}  
     
    сделать  
     
    |rm= {{t|rm|glogn}}, {{t|rm|glonda}}, {{t|rm|glànd}}, {{t|rm|glanda}}

    я бы сделал так, учитывая "Подробнее":

    Код:
    Что: ^[^:]*:\s*([^\n]*)
    Чем: |rm= \1

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 07:47 08-03-2019 | Исправлено: YuS_2, 07:51 08-03-2019
    sikemo

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81
    Akel — ошибка (18)
     
    YuS_2
    |rm= \1
     
    rm — это код языка, он должен заменять свю подстроку до нее на формальное
     
    |кодязыка={{
     
     
    т.е. строку преобазовать из
    * Asturian: {{t|ast|llande|m}}, {{t|ast|abeyota|f}}, {{t|ast|abellota|f}}
    в  
    |ast= {{t|ast|llande|m}}, {{t|ast|abeyota|f}}, {{t|ast|abellota|f}}
    из, напр.
    https://en.wiktionary.org/w/index.php?title=acorn&action=edit&section=7
     
    я вроде исправил и мое работает, мог удалить сообщ., а ну ж ка кто предложит что-то более дельнее…

    Всего записей: 1329 | Зарегистр. 27-11-2008 | Отправлено: 15:10 08-03-2019 | Исправлено: sikemo, 15:11 08-03-2019
    Romul81



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

    Цитата:
    Akel — ошибка (18)  

    Ну, это уже вопросу к редактору. Понятия не имею, что означает в нём эта ошибка.
    В PCRE регулярка рабочая. Как и в JGSoft, Boost, Javascript и куче других диалектов.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 15:34 08-03-2019
    YuS_2



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

    Цитата:
    rm — это код языка, он должен заменять свю подстроку до нее на формальное

    так надо ведь условия более точно описывать... что, откуда и куда...

    Код:
    Что: ^[^:]*:\s*([^\|]*\|([^\|]*)[^\n]*)
    Чем: |\2 = \1

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:50 08-03-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2 (post)
    Цитата:
    так надо ведь условия более точно описывать...

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

    Код:
     
    Search: ^[^\r\n:]+:\s*({{t\+?\|(\w+)\|)
    Replace: |\2= \1
     

    Практически такое же как и у вас, но без лишнего захвата остатка строки. \w+ в данном случае будет достаточно, т.к. в коде языка может быть только несколько латинских букв.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 18:48 08-03-2019 | Исправлено: Romul81, 18:49 08-03-2019
    YuS_2



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

    Цитата:
    без лишнего захвата остатка строки.

    согласен, это, действительно, для данной задачи необязательно.
     

    Цитата:
    \w+ в данном случае будет достаточно, т.к. в коде языка может быть только несколько латинских букв.

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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:37 08-03-2019
    sikemo

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

    Код:
     
    ^[^\r\n:]+:\s*(\{\{t\+?\|(\w+)\|)
     

    сработал как только я отэкранировал фиг. скобки
    работает, но как показала практика, привязка к двоеточию не меняет строки, где оно наличесвует дважды в удаляемой строке, но в целом, хорош работает, СПАСИБО
    рез-т:
    *: Kurmanji: {{t+|ku|belot|sc=Latn}}
    |ky= {{t|ky|жёлудь|sc=Cyrl}}
    * Lao: {{t-needed|lo}}
     
    а вот

    Код:
     
    Что: ^[^:]*:\s*([^\|]*\|([^\|]*)[^\n]*)  
    Чем: |\2 = \1
     

     
    не работает как надо

     
    так же и у меня в Акелпаде

    Всего записей: 1329 | Зарегистр. 27-11-2008 | Отправлено: 22:04 08-03-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