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

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ewild
    Небольшое добавление. Скрипт рабочий есть. Но он выполнен не через прямую регулярку. То-есть я не могу взять, скопировать строку из скрипта и чтобы все заработало. Он сделан через функцию. И вот насколько я понял, единственное решение моей проблемы. Написать функцию. Но на этом мои познания регулярки заканчиваются.
    В инете выложено решение в виде функций. Есть два варианта:
    line.replace(
        /^( {4})+/gm,  
        function(match) { return '\t'.repeat(match.length/4); }  
    )
    либо
    function repeat(str, n) { return new Array(n + 1).join(str); }
    Первый вариант мне понятен. Но не понятно, как его переделать под мои возможности. Пока не получается.

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А я, как ничего не смыслящий в регулярках, подобную задачу решил бы в ста-а-аром UltraEdit'е. Найти: ^p - это Enter с предыдущей строки, четыре пробела в начале строки - заменить на ^p^t  то бишь Enter-Tab. Первая строка правится руками, но это небольшая плата за примитив. Вроде так... Или неправильно поняты исходные условия? Но в конце строк Enter'ы, это признак начала следующей строки и не нужно никаких других. Всю жизнь этим пользуюсь.

    Всего записей: 1228 | Зарегистр. 18-08-2012 | Отправлено: 19:39 13-09-2024
    AkulaBig

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да, неправильно. Вся соль в том, что не все пробелы в начале строки надо заменить на одну табуляцию. То-есть есть 12 пробелов, их надо заменить на 3 табуляции. Я могу это сделать только для всей строки. А вот только для начальных пробелов не получается. Есть скрипт js. В нем такая замена делается в цикле. Видимо и мне придется смотреть в этом направлении.

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

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

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

    Например:

    Код:
    Find
    (?<=[^ \S]|)[ ]{4}(?!\s*$)
    Replace to
    \t

    Прим. Пустые (без печатных символов) строки не обрабатываются.

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 20:19 13-09-2024 | Исправлено: www_world, 20:22 13-09-2024
    AkulaBig

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ваша регулярка отлично отрабатывает на regex101.com. А у меня не работает Вот это выражение вызывает ошибку: ?<=[^ \S]|) Насколько я понимаю, это связано с версией js в AkelPad. Она не поддерживает условия.

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

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AkulaBig
    Так надо указывать используемый синтаксис регэкспов (их всего полсотни можно насчитать) или, в худшем случае, программу, для которой нужен регэксп (далеко не все пограммы даже официально декларируемый их авторами синтаксис регэкспов полностью (согласно спецификациям синтаксиса) поддерживают. И AkelPad - одна из таких).
    Я использовал один из наиболее распространенных, перловый, синтаксис. На regex101.com, очевидно, тоже референсный педантично использован.
    Попробуйте так

    Код:
    \t*[ ]{4}(?!\s*$)
    to
    \t

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 21:44 13-09-2024 | Исправлено: www_world, 21:50 13-09-2024
    AkulaBig

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

    Посмотрите, как у меня записывается условие. Можно-ли ваше выражение под него переделать? Я с такой записью, как у вас в инете сталкивался, но потестить не смог, из-за ошибки. Значит я был на правильном пути. Но вот на 101 не догадался проверить. Думал такое выражение принципиально не работает.

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



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

    Цитата:
    Вся соль в том, что не все пробелы в начале строки надо заменить на одну табуляцию. То-есть есть 12 пробелов, их надо заменить на 3 табуляции. Я могу это сделать только для всей строки. А вот только для начальных пробелов не получается.
    Да, я тупой, поскольку не понимаю что именно требуется из такого описания, поскольку в начале было сказано
    Цитата:
    Подскажите, как начальные пробелы строки заменить на табуляции, не затрагивая конечных пробелов?
    Пример текста в студию!
    Сдается мне, что в шапку надо бы добавить условие по предоставлению того, что предполагается обрабатывать регэкспом. А то уже вторая страница идет, но, судя по всему, народ так и не понял что именно и в каком виде должно быть обработано. Если инфа конфиденциальна, то может быть заменена на любой текст, а вот служебные и прочие знаки должны быть в исходном состоянии.

    Всего записей: 1228 | Зарегистр. 18-08-2012 | Отправлено: 22:15 13-09-2024
    www_world

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AkulaBig
    В первом выражении это не условие, а специальная группа lookbehind (по-русски ее можно перевести - "перед искомым выражением должно иметься следующее (то, что после =). Эта группа, сама по себе, ничего не выбирает в явном виде (у вас на скрине она четырьмя строками выше ["строка следует за ab"]. У меня она имеет альтернативу - которая призвана включить в обработку самую первую строку). Группа же с условием (conditional group), о которой вы говорите, может быть в любом месте выражения и она активная, то есть производит выбор в явном виде. Одно другим заменить нельзя.  
    Конкретно в первом выражении ему не нравится не сама lookbehind группа, а неопределенность (неоднозначность) выбора выражения [^ \S] (любой не пробел и не печатный символ). Эта стандартная проблема для многих программ с регэкспами (фактически, уже по ней можно судить о крутости автора в регэкспах). То есть, если использовать выражение с явным перечислением вариантов aa|bb|cc|...то он, скорее всего, съест.

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 22:35 13-09-2024 | Исправлено: www_world, 22:38 13-09-2024
    AkulaBig

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

    Цитата:
    не понимаю что именно требуется из такого описания

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

    Цитата:
    народ так и не понял что именно и в каком виде должно быть обработано

    Народ уже даже отличное решение выложил. Но оно не работает у меня.

    Цитата:
    что предполагается обрабатывать регэкспом

    Да любой текст. Я сам на первом попавшемся тестю. Собственно еще раз опишу хотелку, хотя выше подробно еще раз объяснял.
    Строка с началом из 12 пробелов (любое число пробелов). Потом текст, потом опять пробелы. Собственно пробелами выполнены отступы в коде.
    Надо чтобы вместо 12 пробелов появились 3 таба. А на конце строки пробелы не заменялись на табы.
    Вот такое решение []{4} заменяет пробелы на табы во всей строке. А надо чтобы заменялись только с начала строки.
     
    Добавлено:
    www_world
    Спасибо. Попытаюсь понять, что вы написали.

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

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

    Цитата:
    Народ уже даже отличное решение выложил. Но оно не работает у меня.  

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

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 23:49 13-09-2024
    AkulaBig

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Огромное спасибо! Вариант \t*[ ]{4}(?!\s*$) отлично работает!
    Я ввиду позднего времени не обратил внимания, что вы выложили новый вариант. Я-то все про (?<=[^ \S]|)[ ]{4}(?!\s*$) пишу.
    На всякий случай проверил на 101 оба варианта. Совершенно идентично отработали.

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    www_world
    Цитата:
    в нем работает отлично, в чем можно убедиться воочию
    Надо было для наглядности включить отображение непечатаемых знаков. Но я все равно не понял, чем тот вариант, что был предложен мной, хуже или работает иначе.
    ^p двенадцать пробелов заменить на ^p^t^t^t кроме первой строки. Второй вариант, которым пользуюсь очень часто, чтобы не забивать мозги - включается режим столбцов, нужное выделяется, удаляется, потом ^p заменяется на ^p^t^t^t кроме той же первой строки.
    Уже говорил, что крайне слаб в регвырах, поэтому приходится пользоваться мозгами и подручными инструментами. За редкими исключениями получается. А с нежеланием регвыров работать на одних софтах, когда вроде бы на других они работают, уже встречался.

    Всего записей: 1228 | Зарегистр. 18-08-2012 | Отправлено: 07:27 14-09-2024
    www_world

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

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

    Если бы я знал, где оное в этом чуде включается... Честно искал три раза - не нашел.
    Наверное оно есть, но ввиду моего криворучия - "мая не шмогла".

    Цитата:
    Но я все равно не понял, чем тот вариант, что был предложен мной, хуже или работает иначе.

    Пробелов может быть произвольное число. Регэксп вида
    ^p    (четыре пробела) (или перловый [\n\r][ ]{4}) не будет работать после первой замены в строке.
    Вам нужно тогда делать выбор из того, что может быть перед следующими четырьмя пробелами (UltraEdit синтаксис, мать его за ногу - переключитесь уже на нормальный, в нем, кроме ненормального родного, еще два нормальных имеются - юниксовый и перловый):
    ^(^{^p^}^{^t^}^)    
    (четыре пробела после последней скобки)
    заменить на
    ^1^t
    Но этот регэксп все равно уступает вышеприведенным перловым по ряду причин.
    Замена пробелов на табы - штатная замена (из контекстного меню) в ряде редакторов для работы с исходниками. В Ultraedit она тоже есть штатно (то есть, регэкспы не требуются, как и режим столбцов): Format - Space to tab (leading). В EditPlus - аналогично.

    Цитата:
    крайне слаб

    Заменить на 'ленив'. Решайте кроссворды по регэкспам и будет вам счастье. После n-ного решенного кроссворда оно гарантированно приходит к всем решавшим.

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 08:16 14-09-2024 | Исправлено: www_world, 08:31 14-09-2024
    AkulaBig

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

    Цитата:
    Если бы я знал, где оное в этом чуде включается... Честно искал три раза - не нашел.

    Только через плагин. AkelPad без плагинов чуть получше блокнота. А вот плагины и скрипты позволяют превратить его в очень мощный текстовый редактор.
    www_world

    Цитата:
    В Ultraedit она тоже есть штатно

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

    Цитата:
    амена пробелов на табы - штатная замена

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

    Цитата:
    ^p двенадцать пробелов заменить на ^p^t^t^t кроме первой строки.

    Вы уверены, что я это просил? К моей просьбе ваше утверждение имеет очень отдаленное отношение

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



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

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

    Всего записей: 1228 | Зарегистр. 18-08-2012 | Отправлено: 09:02 14-09-2024
    AkulaBig

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

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

    Вы зачем-то упорно выкидываете часть вопроса:

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

    Второе предложение тоже входит в вопрос. И зачем писать воду про произвольное количество строк? В конце строки про пробелы написано. Что количество пробелов произвольное, тоже обозначено.
    Хорошо, вот искомый текст:
                  проще один раз увидеть искомый текст, нежели меняющееся описание задачи.          
    Много он вам для понимания дал?

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



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

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

     
    если разложить это на части то мы ищем первый отступ

    Код:
    ^[ ]{2}

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

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

    далее третий отступ, то есть он начинается с первого и вторго отступа, но заменяем мы третий отступ

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

     
    Для AkelPad нужно явно указать пробелы

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

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

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

    Цитата:
     
    (?<=^[ ]{2})[ ]{2}


    Цитата:
    (?<=^[ ]{4})[ ]{2}

    В том-то и дело, что в AkelPad эти выражения выдают синтаксическую ошибку.
    Как и вариант www_world (?<=[^ \S]|)[ ]{4}(?!\s*$).
    То-есть только \t* вместо ?<= отрабатывает без ошибок.
     
    Добавлено:
    www_world

    Цитата:
    Конкретно в первом выражении ему не нравится не сама lookbehind группа, а неопределенность (неоднозначность) выбора выражения [^ \S] (любой не пробел и не печатный символ).

    Наконец-то понял, что вы написали. А то я тоже был удивлен, почему не работает описанное в помощи выражение ?<=
    Интересно, а у AZJIO почему выдает ошибку? У него-же четко указан пробел?
    Цитата:
    (?<=^[ ]{2})[ ]{2})

     
     
    Добавлено:
    www_world

    Цитата:
    В первом выражении это не условие

    (?<=[^ \S]|)[ ]{4}(?!\s*$) Разве | не условие создает? Без него неправильно, но работает. Это ошибка в записи что-ли?

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

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

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

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

    Всего записей: 486 | Зарегистр. 04-11-2018 | Отправлено: 10:13 14-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