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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AkulaBig
    Я ниже добавил для AkelPad
     
    www_world
    Цитата:
    В Ultraedit она тоже есть штатно
    Ну и в AkelPad я делал умный скрипт indent2Tab.js, который ещё и определяет величину пробела перед его заменой и покажет смешанные отступы с предложением использовать автоотступ методом определения увеличения/уменьшения пробелов.
    Только там надо в 112-й строке блок "if" закомментировать, то есть 7 строк, чтобы исключить сброс отступов на пустых строках при автоотступе.

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 10:13 14-09-2024 | Исправлено: AZJIO, 10:28 14-09-2024
    AkulaBig

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

    Цитата:
    Я ниже добавил для AkelPad

    Дак не работает у меня и это выражение ^[ ]{2}|(?<=^  )  |(?<=^    )  Просто забыл именно про него написать.

    Всего записей: 4899 | Зарегистр. 11-03-2003 | Отправлено: 10:25 14-09-2024
    AZJIO



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

    Цитата:
    Дак не работает

    заменить на \t
    Что не работает? у меня выдавал ошибку на {2} и я их заменил на естественные пробелы.

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 10:28 14-09-2024
    AkulaBig

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

    Цитата:
    Что не работает?

    Именно само выражение:
    (?<=^ ) Хоть что туда вписывай.
    www_world

    Цитата:
    если использовать выражение с явным перечислением вариантов aa|bb|cc|...то он, скорее всего, съест.

    Не ест. Вот прям с инета взял пример:
    (?<=<div>).+?(?=</div>)
    Не работает. Видимо все-же от версии js зависит.
     
    Добавлено:
    AZJIO

    Цитата:
    Что не работает?

    Разобрался. Не работает только в скрипте SearchReplace.js. Во встроенной замене AkelPad работает, в FindReplaceEx.js работает. Правда работает не правильно. Не так заменяется, как должно быть.

    Всего записей: 4899 | Зарегистр. 11-03-2003 | Отправлено: 10:45 14-09-2024 | Исправлено: AkulaBig, 11:16 14-09-2024
    73



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я один умный вещь скажу, только не обижайтесь. Вот наглядный пример сравнения заточенных под S&R программ, разумеется, толково сделанных и регэкспов. Шутка с изрядной долей правды.
    Цитата:
    - Нет, понимаешь винда - это такая большая кнопка "сделай мне зашибись". Конечно, иногда она делает не зашибись, иногда не мне и иногда не делает, но обычно всё-таки у меня становится зашибись. В твоем же линуксе необходимо предварительно набрать 30 страниц описаний понятий "сделай" "я" и "зашибись" и если хоть раз ошибешься будет "сделай всем хреново".
    Помнится, где-то просил о способе удаления частей текста по признакам начала и конца. Ессно, в ход первым делом пошли регэкспы, из которых ни один не работал как следует. Зато простенькая программа для поиска/замены делает это за секунды и без напряга. Да, приходится UTF8 в Win1251 конвертить, но это такая мелочь, по сравнению с удобством, скоростью и гибкостью.

    Всего записей: 1228 | Зарегистр. 18-08-2012 | Отправлено: 11:20 14-09-2024 | Исправлено: 73, 11:21 14-09-2024
    AZJIO



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

    Цитата:
    Правда работает не правильно

    видос
    посмотрел скрин, там 4 пробела, а я экспериментировал с отступом 2 пробела, это важно. Регвыр привязан к ширине по числу пробелов.
    И я обновил скрипт indent2Tab.js, вместо закомментировать я сделал по иному, исправив ещё одну ошибку когда в пустой строке пробелов больше чем нужно, они просто игнорируются, вставляется пустая строка.

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 11:21 14-09-2024 | Исправлено: AZJIO, 11:34 14-09-2024
    AkulaBig

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

    Цитата:
    посмотрел скрин, там 4 пробела

    Я скопировал из вашего поста. Если только в пост лишние пробелы попали.
    ^[ ]{2}|(?<=^ ) |(?<=^    )
       1                2 2           4
    73

    Цитата:
    Зато простенькая программа для поиска/замены делает это за секунды и без напряга.

    Да и у меня несколько решений этой проблемы. Но надо было конкретно через регулярку. Собственно решение есть.
    www_world

    Цитата:
    Но не группами по несколько пробелов. Штатная - это удалить/заменить с начала, конца, вокруг. Везде только обработка сразу всех пробелов, но не частями.  
     
    Такой задачи изначально не ставилось и она даже не обсуждалась.

    Я имел ввиду, что такие функции встроены в AkelPad. К моему вопросу отношения это не имеет.
     
    Добавлено:
    AZJIO

    Цитата:
    я экспериментировал с отступом 2 пробела, это важно

    Сейчас еще раз посмотрел с 2 пробелами. Я понял, что не так. У вас ОДИН пробел заменяется на ОДНУ табуляцию. При этом только первые два. А остальные пробелы не удаляются вообще.
    Например.
    1-я строка 14 пробелов. После обработки 2 таба и 12 пробелов.
    2-я строка 2 пробела. После обработки 2 таба.

    Всего записей: 4899 | Зарегистр. 11-03-2003 | Отправлено: 11:41 14-09-2024 | Исправлено: AkulaBig, 11:50 14-09-2024
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AkulaBig
    Там надо понять суть, поэтому я и разложил на участки (в тегах код пробелы в конце сохраняются, кроме одного лишнего в конце)

    Код:
    ^[ ]{2}|(?<=^  )  |(?<=^    )    

    1 пробел но с {2}, то есть эта форма двух пробелов
    далее 2 пробела в скобке и два последующие
    далее 4 пробела и 2 последующие.
     
    Если надо 4 пробела = табуляция, то
    ^[ ]{4}
    далее 4 пробела и 4 за скобкой
    далее 8 пробелов и 4 за скобкой

    Код:
    ^[ ]{4}|(?<=^    )    |(?<=^        )    

     
    при этом это решает три уровня, но если нам надо 4 уровня или с запасом, то мы повторяем скобку добавляя внутри скобки каждый раз по 4 пробела, то есть всё тоже самое, но в конце
    |(?<=^тут12пробелов)туткакираньше4
    |(?<=^тут16пробелов)туткакираньше4

    Код:
    ^[ ]{4}|(?<=^    )    |(?<=^        )    |(?<=^            )    |(?<=^                )    
                       4   4             8      4               12      4             16            4

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 12:00 14-09-2024 | Исправлено: AZJIO, 12:10 14-09-2024
    AkulaBig

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я понял это. У вас в рукопашную один пробел меняется на 1 табуляцию и ниже сдвигается еще и еще. А регулярка www_world в цикле заменяет все пробелы на необходимое количество табов в каждой строке. То-есть алгоритмы совершенно разные. У вас алгоритм именно для кода программирования с отступами.

    Всего записей: 4899 | Зарегистр. 11-03-2003 | Отправлено: 12:08 14-09-2024
    AZJIO



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

    Цитата:
    У вас в рукопашную один пробел меняется на 1 табуляцию и ниже сдвигается еще и еще

    Нет. Скинте файл, я запишу видос с вашим файлом.
    Допускается смешанное (пробел перемешан с табуляцией)? На скрине есть табуляция и потом пробелы, а я сделал регвыр если в начале только пробелы.
     
    Добавлено:

    Цитата:
    А регулярка www_world в цикле заменяет все пробелы на необходимое количество табов в каждой строке

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

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 12:11 14-09-2024 | Исправлено: AZJIO, 12:19 14-09-2024
    AkulaBig

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

    Цитата:
    На скрине есть табуляция и потом пробелы, а я сделал регвыр если в начале только пробелы.

    Дак у меня в исходнике только пробелы. На скрине после обработки вашим выражением. То-есть смешанное не допускается. Файл примера выше я прям в посте выложил. Только копируйте с пробелами.

    Цитата:
    то есть если где-то по тексту будет 4 пробела, они тоже заменятся на табуляцию.

    Ну вроде ситуация маловероятная, что в середине окажется 4 пробела. Причем правильных. Для меня это некритично.
     
    Добавлено:
    Далеко листать. Повторю тестовый файл:
                  AkelPad-настройки-параметры-редактор1-зазор между строк 0          
                  - пример AkelPad-настройки-параметры-редактор1-зазор между строк 0          
      AkelPad-настройки-параметры-редактор1-отступ текста - слева 1          
     
     Цветовая тема  
     
     
    Добавлено:
    Я вот что подумал. Хорошо, что в середине строки 4 пробела тоже будут на табы меняться. Например, так в строке меню текст отделяется от хоткея. В этом случае замена тоже нужна.

    Всего записей: 4899 | Зарегистр. 11-03-2003 | Отправлено: 13:32 14-09-2024
    AZJIO



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

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 22:29 14-09-2024
    www_world

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

    Цитата:
    (?<=[^ \S]|)[ ]{4}(?!\s*$) Разве | не условие создает?

    Нет. Это оператор ИЛИ
    Напр, (?<=[^ \S]|\t|\n|\r|...|)[ ]{4}(?!\s*$)
    Условие, это, например
    ([\s]{3})?(?(1)\S|\s{2,10}) - если встречаем три непечатных символа, то ищем за ними один печатный, в противном случае - от 2 до 10 непечатных.

    Цитата:
    Без него неправильно, но работает.

    Akelpad - не поддерживает продвинутые регэкспы и все, что что он делает с ними, если не выдает ошибку - его фантазии. Например, у EditPlus - та же беда. Но для простого редактирования это у него компенсируется другими возможностями. Разбираться, же с точной, посимвольной границей, где кончаются его вменяемые способности - бессмысленное.занятие. В обсуждаемом редакторе, полагаю, тоже самое.
    Чтобы не иметь проблем, разумнее использовать более надежные редакторы. Если же никак - то не стоит рассчитывать на полный спектр возможностей, а заведомо ограничить себя скромным, но надежным их кругом в любимом редакторе.

    Цитата:
    Интересно, а у AZJIO почему выдает ошибку?

    Вероятно АР  в lookbehind хронически не переваривает одновременно более одного типа неопределенных операторов - в данном случае это [] и {} и ему до лампочки абсолютное значение всего выражения (даже если оно означает один единственный символ).

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 01:38 15-09-2024 | Исправлено: www_world, 01:50 15-09-2024
    AZJIO



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

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

    На сколько я знаю AkelPad использует собственный движок регулярных выражений. Каковы причины не знаю. На мой взгляд можно было использовать Scintilla и PCRE, ведь они бесплатны, всего лишь добавить файл лицензии этих модулей в дистрибутив.

    Цитата:
    Вероятно АР  в lookbehind хронически не переваривает одновременно более одного типа неопределенных операторов

    в каком то смысле даже мне ранее казалось что (?<=...) может стоять только в начале регвыра, я не представлял что его можно использовать дважды и трижды и более и вставлять где нибудь в средине, так как пройдя часть шаблона глупо проверять назад, например abc(xx) и a..(?<=bc)(xx) то есть мы можем последовательностью добавить предыдущие символы, без просмотра назад, поэтому мне казалось что это используется только в начале регвыра. У PCRE тоже при желании можно найти то, что очевидно не работает, например  (?<=...) должен иметь явную длину, то есть нельзя использовать {2,3} или *, когда просмотреть назад можно только вернувшись на чётко заданное число символов и проверить это (устраняется проблема использованием \K). На просмотр вперёд этого ограничения нет.
    У Scintilla встроенные регвыры ещё больше ограничены, нельзя задать диапазон [a-z], нет предпросмотра вперёд и назад (?<=...) и (?=...), нет знака ИЛИ "|".

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 02:09 15-09-2024
    www_world

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

    Цитата:
    Не ест. Вот прям с инета взял пример:
    (?<=<div>).+?(?=</div>)
    Не работает. Видимо все-же от версии js зависит.  

    про них в их интернетах не скажу, а у меня в АР работает

     
    Добавлено:

    Цитата:
    в каком то смысле даже мне ранее казалось что (?<=...) может стоять только в начале регвыра,  

    Насколько я помню, речь выше шла о том, что lookbehind не может стоять в произвольном месте. И могу повторить это снова. Просто потому, что он неактивный и его расположение лимитировано расположением других выражений. А сколько именно м.б. в выражении lookbehind - это совсем другая история.
    Тогда как положение активных выражений априори ничем не лимитируется, кроме общего смысла регэкспа (то есть с активными выражениями можно комбинировать что угодно и оно будет корректно по форме, но в части случаев будет лишено смысла). С lookbehind комбинировать что угодно априори не получится. Отсюда и растут уши всех проблем у программ с поддержкой нелюбых lookbehind. Проблема реализации однозначной и воспроизводимой логики работы выражения. Формальная запись правильная и несложная, но как ее реализовать для однозначного выполнения - авторам программ непонятно. Нужно вводить понятие старшинства операторов и/или порядка выполнения. А это требует кординальной перестройки всего движка, который создан еще в юности... А сейчас мозги на абстракциях уже не так скоры... В общем дело понятное и обычное. Поэтому и нужно выбирать то, что сразу, в момент выбора, не имеет врожденных и, скорее всего, никогда не исправимых проблем. 90% проблем тут именно с инструментами, а не с регэкспами.

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 02:23 15-09-2024 | Исправлено: www_world, 03:26 15-09-2024
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    www_world
    ещё зависит, где использовать, непосредственно движком AkelPad или движком js в скрипте, получив позицию и длину.
     
    Кстати, это действует на одну строку, так как \G только от начала.

    Код:
    \G(?:[ ]{4})*?\K[ ]{4}

    Вот если бы такая схема работала для начала строки ^, то это было бы то что нужно. Ну или читать файл построчно и применять к каждой строке.
     
    Попробовал рекурсивный вызов

    Код:
    ^([ ]{4})|(?1)

    ничего не понял, но это работает. Здесь (?1) это ссылка на ^([ ]{4}) (то есть перед "|") с рекурсивным повтором. Я просто пытался понять рекурсию в регвыре методом тыка и это сработало (конечно же используя PCRE). Но работает не только от начала строки.

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 03:12 15-09-2024 | Исправлено: AZJIO, 04:22 15-09-2024
    www_world

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

    Цитата:
    ещё зависит, где использовать, непосредственно движком AkelPad или движком js с крипте, получив позицию и длину.  

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

    Цитата:
    Вот если бы такая схема работала для начала строки ^, то это было бы то что нужно.

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

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 03:55 15-09-2024
    AZJIO



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

    Код:
    (?<=^|^[ ]{4}|^[ ]{8}|^[ ]{12}|^[ ]{16})([ ]{4})

    работает на глубину 5 табов. В теории имеет свои проблемы: возвращается назад, чтобы проверить все ветви разделённые знаком ИЛИ "|" и имеет ограничение в глубину. Если добавлять глубину, то ухудшать ещё больше скоростные характеристики.
     
    Этот регвыр перед блоком требует ещё 4 пробела, так что внутри текста сработает только при 8 последовательных пробелов.
    ((?<=[ ]{4}|^)([ ]{4}))|(?1)

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 04:17 15-09-2024 | Исправлено: AZJIO, 04:21 15-09-2024
    AkulaBig

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

    Цитата:
    видос


    Цитата:
    работает на глубину 5 табов.

    Ну я так и понял, что у вас именно обработка отступов. В моем случае просто замена любого количества пробелов на любое количество табов. В вашей коллекции скриптов есть SpacesToTabs.js от VladSh. Вот он практически одно и тоже, что я хотел. Только у VladSh последние пробелы полностью в таб превращаются, если пробелов меньше заданных. То-есть 6 пробелов превратятся в один таб. Насколько я понимаю просто не * используется, а +. Мне так не надо, поэтому не проверял.
     
    Добавлено:
    www_world

    Цитата:
    Нет. Это оператор ИЛИ

    Может это не совсем корректно, но ИЛИ и есть для меня условие. Но не будем спорить о терминах. Давайте разберем ваш ответ.
    Напр, (?<=[^ \S]|\t|\n|\r|...|)[ ]{4}(?!\s*$)
    |...| Второй | это ошибка? У вас-же |...
    Условие, это, например
    ([\s]{3})?(?(1)\S|\s{2,10})
    И у вас тоже самое (?<=[^ \S]|)[ ]{4}(?!\s*$) Если не то-то , то ничего не меняем. Не могу протестировать ?<= поэтому не могу понять.

    Цитата:
    Вероятно АР  в lookbehind хронически не переваривает одновременно более одного типа неопределенных операторов

    Понятно. Считаю вопрос ?<= надо закрывать. Не работает он в Акельке и все.
    AZJIO

    Цитата:
    ^([ ]{4})|(?1)
    ничего не понял, но это работает.

    У меня везде ошибку выдает.
     

    Всего записей: 4899 | Зарегистр. 11-03-2003 | Отправлено: 06:08 15-09-2024
    AZJIO



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

    Цитата:
    вопрос ?<= надо закрывать. Не работает он в Акельке и все.  

    работает, но без ИЛИ "|". Видимо подразумевается назад одно выражение, а не несколько.
    AkelPad выдаёт ошибку указывая позицию на которой сбой и выделяя текст регвыр начиная со сбойного символа.
    В моей проге ошибка выдаётся в режиме поиска в окне результатов (на английском языке), сам движок регвыр их даёт, прога просто выдаёт официальные ошибки движка, если ему не нравится регвыр.

    Цитата:
    У меня везде ошибку выдает.  

    там же рекурсивная ссылка, не для AkelPad.

    Всего записей: 4547 | Зарегистр. 03-05-2006 | Отправлено: 07:12 15-09-2024 | Исправлено: AZJIO, 07:17 15-09-2024
    Открыть новую тему     Написать ответ в эту тему

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