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

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



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

    Цитата:
    Да, но при этом, группу с кавычками он пропускает.

    Естественно, т.к. кавычки не будут захвачены, а сразу за ними следует цифра - так составлен шаблон...
     

    Цитата:
    А он пропускает группу с кавычками или заменяет вместе с кавычками?

    А какая, собственно, разница? Что в итоге требуется? Результат или осознание происходящих процессов?

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

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

    Цитата:
    А какая, собственно, разница? Что в итоге требуется? Результат или осознание происходящих процессов?  
     
    В первую очередь
    Цитата:
    как это работает, абстрактный пример:
    для итога уже есть пример реального применения, но я пока не уверен, что разобрался - VVL99 - пост

    Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 15:37 10-04-2019 | Исправлено: VVL99, 15:38 10-04-2019
    YuS_2



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

    Цитата:
    но я пока не уверен, что разобрался

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

    Код:
    "*(\d+)"*

    - совпадает, если в любом месте текста найдено ноль или более символов двойной кавычки ", за которыми сразу же следует один или более символов цифр [0-9], за которыми сразу же следует ноль или более символов двойной кавычки ". При этом, в момент найденного полного совпадения с шаблоном, у нас будет одна "записанная в память" группа символов (в данном случае группа цифр) с обратной ссылкой \1, что используется при замене текста по шаблону.
     
    Вообще, в двух словах, естественно, всех нюансов описать не получится, тут лучше поизучать литературу (лично я советую Джеффри Фридла "Регулярные выражения", в шапке есть ссылка)...

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    В принципе я так и делал, но результат не всегда предсказуемый, поскольку не все действия казалось бы простого выражения известны. Когда-то посмотрел это видео - https://www.youtube.com/watch?v=VCgAvj9meHg
    и сложилось видимо недостаточное понимание.

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



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

    Цитата:
    Когда-то посмотрел это видео

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

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

    Это да, при редком использовании, не всё запоминается легко... но если встречаются непонятные квантификаторы, метасимволы и т.п., то всегда ведь есть возможность заглянуть в шпаргалку... у каждого она своя, но лично я,  
     предпочитаю заглядывать в первоисточник PCRE

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Практический пример предпросмотра для форума/
    было так:
    Код:
    a = a.replace(/(^|[^=>'"\]])(http:\/\/.+?)(\n|\s|,|$)/gi, "$1<a href='$2'>$2</a>$3");
                a = a.replace(/(^|[^=>'"\]])(https:\/\/.+?)(\n|\s|,|$)/gi, "$1<a href='$2'>$2</a>$3");
                a = a.replace(/(^|[^=>'"\]])(ftp:\/\/.+?)(\n|\s|,|$)/gi, "$1<a href='$2'>$2</a>$3");
                a = a.replace(/(^|[^=>'"\]\/])(www\..+?)(\n|\s|,|$)/gi, "$1<a href='$2'>$2</a>$3");

    сделал так:
    Код:
    a = a.replace(/(^|\s)((ht|f)tp.?:\/\/.+?)(\s|\n|$)/gi, "$1<a href='$2'>$2</a>$4");
                a = a.replace(/(^|\s)(www\..+?)(\s|\n|$)/gi, "$1<a href='$2'>$2</a>$3");
    хотя оба варианта показывают ссылки также как и форум. Т.е. текст из формы ответа вставляем в блок превью.
     
    Добавлено:
    https://dump.video/i/4FfUzc.mp4

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



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

    Цитата:
    сделал так:

     
    А я бы сделал так:
     

    Код:
    a = a.replace(/\b((?:https?|ftp):\/\/[^\s\/$.?#].\S*)/gi, "<a href='$1'>$1</a>");

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

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

    Код:
    "[url=http://ya.ru]Ссылка[/url]".replace(/\b((?:https?|ftp):\/\/[^\s\/$.?#].\S*)/gi, "<a href='$1'>$1</a>");
    меняет и ссылки с тегами.
     
    Добавлено:
    Проверяем так:
    В форму ответа вставляем ссылки и ссылки с тегами:
     

    Код:
    https://ya.ru/1
    [url=http://ya.ru]Ссылка[/url], [url=www.ya.ru]Ссылка[/url]
     https://ya.ru/2
    www.ya.ru/3
    ftp://ya.ru/4  
    http://ya.ru/5  http://ya.ru/6  
    http://ya.ru/7, http://ya.ru/8

    В консоле браузера пишем код замены и вставки в последний пост:

    Код:
    var a = document.querySelectorAll(".post");
    a[a.length-1].innerHTML = post.value.replace(/\b((?:https?|ftp):\/\/[^\s\/$.?#].\S*)/gi, "<a href='$1'>$1</a>");

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



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

    Код:
    a[a.length-1].innerHTML = post.value.replace(/\b((?:https?|ftp):\/\/[^\s\/$.?#].\S*)/gi, "<a href='$1'>$1</a>");  

    Здесь у меня сомнения в
    Цитата:
    [^\s\/$.?#].\S*
    , здесь [^\s\/$.?#] заменяет один символ, далее точка заменяет один символ, далее \S* заменяет остальные символы ссылки. К чему такая связка? Когда я дал набор запрета символов ссылки [^\s\/$.?#], подрузмевалось что это будет все символы ссылки кроме указанных, то есть [^\s\/$.?#]+ что захватывает все символы ссылки до её конца, поэтому там не нужна точка и не нужен повтор не пробельного символ, даже потому что он не верен, потому что набор запретных символов ссылки $.?#, а не пробел их позволяет, а значит захватит все их. Хотя мой набор был такой [^\s,<>#%"], но вроде как проценты надо убрать, потому что ссылка для русских букв записывается в бинарных кодах с использованием %, значит [^\s,<>#"]+
    то есть либо либо
    (?:https?|ftp):\/\/\S+)
    (?:https?|ftp):\/\/[^\s,<>#"]+)

    Всего записей: 4545 | Зарегистр. 03-05-2006 | Отправлено: 08:36 11-04-2019 | Исправлено: AZJIO, 08:40 11-04-2019
    YuS_2



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

    Цитата:
    Практический пример предпросмотра для форума

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

    Цитата:
    В консоле браузера пишем код замены и вставки в последний пост

    Учитывая ограниченность регулярок в javascript (нет просмотра назад, нет сверхжадных квантификаторов), можно попробовать сделать так:

    Код:
    var a = document.querySelectorAll(".post");  
    a[a.length-1].innerHTML = post.value.replace(/(\=)?((?:(?:ftp|https?):\/\/|www\.)[^\s,\]]+)(?!\s*\])/gi, function($0, $1){
        return $1 ? $0 : "<a href='"+$0+"'>"+$0+"</a>";
    });

     

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 09:30 11-04-2019 | Исправлено: YuS_2, 09:31 11-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я когда то делал такой
    Код:
    (?si)https?://[\w.:-]+[\w/?&=.~;\-+!*_#%]*

    здесь [\w.:-]+ это домен, а дальше идёт путь [\w/?&=.~;\-+!*_#%]*, хотя проще игнором  [^\s,<>"]* почему тут вместо + стоит * потому что можно указать домен типа
    Код:
    http://forum.ru-board.com
    http://forum.ru-board.com/
    http://forum.ru-board.com/index.html
    и это всё будет ссылкой
    хотя в домене ru-board есть тире, значит надо переделывать (уже переделал)
    С учётом что домены теперь могут быть в национальных языках и перекодироваться браузером в латинские, то фактически весь юникод теперь поддерживается, действительно кроме пробелов.
     
    YuS_2
    почему у тебя просмотр вперёд имеет символ повтора?

    Код:
    (?!\s*\])
    или он допускается в javascript

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



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

    Цитата:
    Здесь у меня сомнения в  

    Понимаю ваши сомнения. Чтоб не мудрствовать лукаво взял наиболее корректную из коротких регулярок отсюда (@stephenhay) и изменил чуть.
     
    YuS_2 (Пост)

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

    Наиболее правильный, на мой взгляд подход. Чуть поразмыслил и получил такой результат. Тестовый скрипт (синтаксис ES6)
    Вывод консоли
    Как я понял, задумка состоит, также в том, чтобы подхватывать ссылки, которые начинаются с www, но в которых отсутствует http. В тестовом скрипте эта проблема тоже решена (в ссылку подставляется http). Уже обрамлённые BB-Code ссылки игнорируются.
     
    Таким образом, для продакшена код следующий:
    Регулярка:

    Код:
    var re = /\[url=(?:(?:https?|ftp):\/\/[^\s/$.?#].\S*)?\s*\](?:(?!\[\/url\]).)*\[\/url\]|((?:(?:ftp|https?):\/\/|(www\.))[^\s/$.?#].\S*)/gi;

     
    Функция реплейсер:

    Код:
    var replacer = function ($0, $1, $2) {
      return $2
        ? '<a href="http://' + $0 + '">' + $0 + '</a>'
        : $1
          ? '<a href="' + $0 + '">' + $0 + '</a>'
          : $0;
    };
     

     
    Использование:

    Код:
    var out = str.replace(re, replacer);

     
     
    Добавлено:
    AZJIO (Пост)

    Цитата:
     

    Код:
    (?!\s*\])

    или он допускается в javascript

    Если смотреть вперёд, то он везде практически допускается. Другое дело, что эта "отбивка" может работать некорректно в плане логики. Как раз из-за переменной длины. Надо тестировать тщательно.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 11:50 11-04-2019 | Исправлено: Romul81, 11:54 11-04-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В общем игнор символов в ссылке
    [^\s,<>"\]\[]+  
    Убрал # потому что якорь в ссылках, кавычки и апостроф используются ограничением параметра в HTML-коде href="http://...", Notepad++ захватывает запятую как часть ссылки.
     
    Romul81

    Цитата:
    Если смотреть вперёд, то он везде практически допускается.
    Наоборот в PCRE он не допускается, он возвратит ошибку, он просто ничего не найдёт. Просмотр вперёд и назад допускается, когда просматриваемая длина известна, мы это уже обсуждали недавно. Вместо этого используется \K, но без возврата к точке /K для поиска следующего.

    Всего записей: 4545 | Зарегистр. 03-05-2006 | Отправлено: 12:09 11-04-2019 | Исправлено: AZJIO, 12:24 11-04-2019
    YuS_2



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

    Цитата:
    почему у тебя просмотр вперёд имеет символ повтора?

    А вперед, как правило, нет ограничения на фиксированную длину, это в некоторых реализациях просмотра назад существует такое ограничение, в силу сложности реализации...
     
    Romul81

    Цитата:
    Другое дело, что эта "отбивка" может работать некорректно в плане логики.

    По большому счету, это остатки от тестирования. Эту конструкцию просмотра вперед можно вообще выкинуть, т.к. она не особо помогает, ибо нет сверхжадности в javascript и она скорее даже ухудшает работоспособность шаблона в целом. И кроме того, вторая группа там тоже не нужна - те же остатки тестов...

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



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

    Цитата:
    Наоборот в PCRE он не допускается, он возвратит ошибку, он просто ничего не найдёт. Просмотр вперёд и назад допускается, когда просматриваемая длина известна,

    Это не так. На заглядывание вперёд таких ограничений нет. По крайней мере в известных мне диалектах, в т.ч. PCRE.
     
    Также, в случае заглядывания назад, этого ограничения нет в .NET, JGSoft и новом Javascript (V8). В PCRE - да, есть.

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



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

    Цитата:
    Наоборот в PCRE он не допускается, он возвратит ошибку, он просто ничего не найдёт.

    Пруф или пример на это имеется?
    Вперед допускается нефиксированная длина... другое дело, что квантификаторшаблон должен быть ненулевым, т.е. + или {1,} и т.п., но как я и написал выше, это вообще "лишняя" часть в шаблоне, в данном случае, её можно выкинуть...
    Пример правильный
    Пример НЕправильный

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 12:40 11-04-2019 | Исправлено: YuS_2, 12:48 11-04-2019
    data man



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

    Цитата:
    Также, в случае заглядывания назад, этого ограничения нет.... В PCRE - да, есть.

    Интересно, а в PCRE2?

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 12:43 11-04-2019
    Romul81



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

    Цитата:
    Интересно, а в PCRE2?

     

    Цитата:
    PCRE2 10.30–10.31 does not support infinite repetition inside lookbehind

    Это из RegexBuddy. Т.е. нет, не поддерживается.
     
    Добавлено:
    З.Ы. А если попытаться задать диапазон (?<!\s{1,3}\]). , то тоже:

    Цитата:
    PCRE2 10.30–10.31 does not support variable repetition inside lookbehind or alternatives of different lengths inside groups inside lookbehind

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



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

    Цитата:
    Интересно, а в PCRE2?

    The contents of a lookbehind assertion are restricted such that all the strings it matches must have a fixed length.

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81
    Ага, в 10.32 (?<!\s{1,3}\]) тоже не работает.

    Цитата:
    pcre2grep: Error in command-line regex at offset 0: lookbehind assertion is not fixed length

     
    Добавлено:
    YuS_2


    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

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