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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2

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

    Правильное составление зависит от знания всех возможных ситуаций, а при учитывании, что комментарии могут содержать ситуации которые могут быть в обычном тексте, то ситуация стремиться к бесконечности вариаций. Начинать исключать комментарии? Да их просто удалить потребуется несколько регулярок, а чтобы обработать зная что ты находишься не внутри комментариев, это только на словах так красиво можно излагать. Если бы движок был настолько крут, то наверно для обработки текста не нужно было бы языки программирования.
    Вот пример, нужно чтобы комментарии начинающиеся с начала строки имели вид "; т", а в конце строки кода " ; т", а если комментарий пустой то удаляем
    ;(?!\h)
    "; "
    [^\r\n];
    " ;"
    \r\n\h*?;\h*?\r\n
    \r\n\r\n
    Вот соедини три регулярки в одну, и да, нужно учесть что строки
    ;{
    ;}
    являются блоками сворачивания и их нельзя ломать. Вот соедини три условия в одно с учётом 4-го правила.
    Но самое главное, если регулярка не гарантирует мне исправность кода, то есть надежда на "повезёт", то сразу говорю, это не мой вариант, я лучше не буду ломать код, у меня несколько тысяч файлов кода, и хотелось бы их одной регуляркой исправить, но не хотелось бы потом гадать почему через один файл не работает.
     
    Если ты считаешь что можно три различные регулярки использовать одним проходом, как самостоятельные, то я в этом не уверен,  она если находит 1 вариант то не возвращается чтобы проверить не совпал ли другой вариант, а часть одного может быть частью другого, а там где приоритет первого, в другом тексте может быть приоритет второго, но приоритет в регулярке не регулируется, сначала проверяется не совпадает ли первый, если отмена, то проверяет второй, а если оба имеют возможность захватить, но сработает нерелевантный. Даже если предположить что можно написать изощрённый метод регулярку на пол-страницы с многократными откатами, то это опять только предположение, как если бы я сказал челу если фотошоп, винду кто-то написал, то почему ты не можешь. На данный момент я готов на синицу в руках, а не на журавля в небе. Ну если заявляешь что регулярка всё может, то жду решения, не против объединения проверки операторов и комментариев в одну.
     
    Кстати, я тут для Notepad++ делаю плаг DB_RegExp, сегодня обновил немного.

    Всего записей: 4558 | Зарегистр. 03-05-2006 | Отправлено: 22:40 08-04-2019 | Исправлено: AZJIO, 22:49 08-04-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Попробуйте взглянуть на проблему с другой стороны. Судя по тому, что вы написали, без программной логики здесь не обойтись.  
    Напишите что-то типа парсера с простеньким функционалом. Отделить мух от котлет, т.ск., комментарии отдельно, код отдельно. И каждый из блоков обработать своей  логикой. Можно при этом в случае замен вставлять временный маркер, типа %%%. Если всё нормально - одним движением его удалите. Если нет - подправите скрипт обработки под эти специфические ситуации. Думаю, вы поняли идею. Регулярки, заточенные на конкретные ситуации, могут быть гораздо проще. Вы просто подаёте в нужные функции уже протестированный стринг.
     
    Примерно так словаределы обрабатывают текст в perl и nodejs. На AutoIt это тоже можно сделать. И уж тем более на Python или Purescript.

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



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

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

    Естественно, именно это и имел в виду, упоминая предварительный анализ текста перед обработкой... и да, помимо желания, необходимо ведь ещё и хорошее знание синтаксиса языка, исходные коды которого будем обрабатывать. Не уверен, что у меня оно (знание) есть...
     

    Цитата:
    Начинать исключать комментарии?

    Почему нет? Комментарии, они и в Африке комментарии - ни на что не влияют, ни к чему не обязывают... имхо, вполне можно и исключить из обработки.
     

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

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

    Цитата:
    Вот пример, нужно чтобы комментарии начинающиеся с начала строки имели вид "; т", а в конце строки кода " ; т", а если комментарий пустой то удаляем  
    ;(?!\h)  
    "; "  
    [^\r\n];  
    " ;"  
    \r\n\h*?;\h*?\r\n  
    \r\n\r\n  
    Вот соедини три регулярки в одну, и да, нужно учесть что строки  
    ;{  
    ;}  
    являются блоками сворачивания и их нельзя ломать. Вот соедини три условия в одно с учётом 4-го правила.
     

    См. выше: Необходим массив текста (потому как изобретение велосипеда может привести к созданию транспортного средства с квадратными колесами...), включающий в себя наиболее сложные моменты и условия задачи... а просто соединять регулярки, наверное, не особо продуктивно, т.е. не вижу пока смысла.
     

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

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

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

    Если говорить о задаче в целом, а не разбирать частности, то вот, верно же, выше говорят: почему бы не использовать возможности какого-либо ЯП? Рассчитывать на возможности чистых регэкспов, при достаточно сложной задаче, не совсем продуктивное занятие, а зачастую, при использовании и затратное по времени обработки.
     
    Добавлено:

    Цитата:
    Ну если заявляешь что регулярка всё может

    где это было такое заявление?
    Плюнь тому в лицо, кто такое заявляет...

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:01 09-04-2019
    VVL99

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

    Код:
    111
    222
     333
    444 555

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

    Код:
    ([^"]\d{3})

    и замена

    Код:
    "($1)"

    Всё действо в np++
    Во-первых рег. забирает не только группу, но и символ впереди группы.
    Во-вторых рег. не видит первую группу.
    Это наверно азы, но до меня не доходит, поскольку пользуюсь регулярками, только по мере надобности.

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 21:45 09-04-2019 | Исправлено: VVL99, 22:11 09-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    (\d++)
    "\1"
    результат
    "111"
    "222"
     "333"
    "444"  "555"

    Всего записей: 4558 | Зарегистр. 03-05-2006 | Отправлено: 22:55 09-04-2019
    VVL99

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    А про повторную установку кавычек забыл.

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 23:01 09-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    покажи как должно получится,  я не понимаю где не должны быть кавычки
     
    так?
    (?<!["\d])(\d++)(?!")
    "\1"
     
    Не работает только если одна кавычка
    "111"  
    "222"  
     "333"  
    "444"  "555"  
    111
    222
     333"
     "333
    444 555
     
    кстати может в реальном условии можно учесть буквы? А то я бы применил метасимвол границы \b

    Всего записей: 4558 | Зарегистр. 03-05-2006 | Отправлено: 23:03 09-04-2019 | Исправлено: AZJIO, 23:21 09-04-2019
    VVL99

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Я наверно не совсем понятно условие повторной установки кавычек объяснил, допустим, что там уже могу быть кавычки:

    Код:
    111
    222
     333
    444 555
    "111", 222
    777
     

    Надо при любых комбинациях получить такое:

    Код:
    "111"
    "222"
     "333"
    "444" "555"
    "111", "222"
    "777"
     

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 23:22 09-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    Это учитывает любой набор кавычек
    (?x)(?<!["\d])(\d++)(?!")  |   (?<!["\d])(?:(\d++)")  |  (?:"(\d++))(?!")
    "\1\2\3"
     
    Это только не учитывает одну кавычку
    (?<!["\d])(\d++)(?!")
    "\1"
     
    Проверил на этом
    111
    "111
    111"
    "111"

    Всего записей: 4558 | Зарегистр. 03-05-2006 | Отправлено: 23:37 09-04-2019 | Исправлено: AZJIO, 23:39 09-04-2019
    VVL99

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Вроде бы оба варианта работают как надо.
    И всё-таки непонятно почему такое исключение:

    Код:
    [^"]

    захватывает какой-то первый символ.

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 23:55 09-04-2019 | Исправлено: VVL99, 23:56 09-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    класс в квадратных кавычках [^"] это один символ, его можно размножить [^"]+ (1 и более) или  [^"]* (0 и более), но если он захвачен он будет. Чтобы не захватить нужно просмотр вперёд  (?!...)  (?=...)  или просмотр назад  (?<!...)  (?<=...)
    Можно обхитрить, воткнуть его в группу замены типа ([^"]x) заменить на \1 то есть он не потеряется вставившись с группой.
     
    Пояснение
    (?x)(?<!["\d])(\d++)(?!")  |   (?<!["\d])(?:(\d++)")  |  (?:"(\d++))(?!")
    Здесь 3 регулярки, флаг (?x) позволяет пробелы, чтобы отделять части элементов,  в обработке они не участвуют
    (?<!["\d])   (\d++)   (?!") здесь просмотр вперёд и назад, то есть ищем число (\d++) в скобках чтобы возвратить, ++ означает искать вперёд не проверяя, то есть число захватиться всё, иначе он может захватить часть числа и в средине вставить кавычку, если не позволяешь ему вставить её в конце. Просмотр назад (?<!["\d]) то есть перед числом не должно быть кавычка и число. Просмотр вперёд (?!") после числа не должна быть кавычка. Это первая регулярка ставит кавычки если число совсем без кавычек.
    А что если одна кавычка слева или одна справа? Добавил две регулярки для этих случаев (?<!["\d])(?:(\d++)"), то есть одинаковость что в обоих есть группа (\d++) и группы с просмотром назад (?<!["\d]) и вперёд (?!"), то есть запрещают с одной стороны иметь кавычку. Но на другой стороне кавычка допускается (?:(\d++)") здесь (?:...") означает группа без захвата (?:...), но с кавычкой, то есть регулярка ищет с кавычкой, но при замене вставляет без кавычки, а кавычки вставляются в строке замены обе. Мы таким способом удалили лишнюю кавычку.

    Всего записей: 4558 | Зарегистр. 03-05-2006 | Отправлено: 23:59 09-04-2019 | Исправлено: AZJIO, 00:32 10-04-2019
    VVL99

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Значит я просто неправильно понимал это выражение, придётся переделывать, только сперва разобраться.
     
     
    Добавлено:
    Потому, что непонятно теперь как это работает, но ведь делал то сознательно, даже не понимая что делаю.

    Код:
    a = a.replace(/(^|[^=>'"\]])(http:\/\/.+?)(\n|\s|,|$)/gi, "$1<a href='$2'>$2</a>$3");

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 00:29 10-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    А нельзя искать просто ссылку и заменить её на обрамление тегами
    (https?://[^\s,<>#%"]+)
    "<a href='$1'>$1</a>"
     
    a = a.replace(/(https?:\/\/[^\s,<>#%"]+)/gi, "<a href='$1'>$1</a>");
     
    Я посмотрел какие символы запрещены в URL и добавил их в класс [^\s,<>#%"]+

    Всего записей: 4558 | Зарегистр. 03-05-2006 | Отправлено: 00:43 10-04-2019 | Исправлено: AZJIO, 00:55 10-04-2019
    VVL99

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO - пост Это вообще надо сохранить как мануал! Склероз то придёт.

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 00:55 10-04-2019 | Исправлено: VVL99, 01:00 10-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    В шапке уже есть шпаргалка.

    Всего записей: 4558 | Зарегистр. 03-05-2006 | Отправлено: 00:57 10-04-2019
    VVL99

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

    Цитата:
    А нельзя искать просто ссылку и заменить её на обрамление тегами
    Так я по этому и говорил про исключения, поскольку в тексте могут уже быть готовые теги с ссылками.
    http://forum.ru-board.com/postings.cgi?action=edit&forum=2&topic=2753&postno=1361

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 01:00 10-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VVL99
    a = a.replace(/(?<![=>'"\]])(https?:\/\/[^\s,<>#%"]+)(?![<'"\[])/gi, "<a href='$1'>$1</a>");

    Всего записей: 4558 | Зарегистр. 03-05-2006 | Отправлено: 01:10 10-04-2019
    VVL99

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

    Код:
    SyntaxError: Invalid regular expression: /(?<![=>'"\]])(https?:\/\/[^\s,<>#%"]+)(?![<'"\[])/: Invalid group

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 01:20 10-04-2019
    YuS_2



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

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

    Например, так:  

    Код:
    Что: "*(\d+)"*
    Чем: "\1"

    ссылка
     

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

    Да, правильно. Выполняется именно то, что написано в шаблоне:
    [^"] - захватит любой символ, кроме двойной кавычки.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:17 10-04-2019 | Исправлено: YuS_2, 08:18 10-04-2019
    VVL99

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

    Цитата:
    [^"] - захватит любой символ, кроме двойной кавычки.
    Да, но при этом, группу с кавычками он пропускает.
    Цитата:
    "*(\d+)"*  
    А он пропускает группу с кавычками или заменяет вместе с кавычками?

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 13:54 10-04-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