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

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

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

    Цитата:
    файлом со случаем " смеси причем всех возможых типов" не поделитесь?  

    https://www90.zippyshare.com/v/rblCl28N/file.html

    Всего записей: 1375 | Зарегистр. 17-01-2011 | Отправлено: 13:20 12-02-2020
    los

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Jonmey,
    спасибо. Наличие или отсутствие т.н. line ending влияет на решение задачи в описываемых вами случаях?

    Всего записей: 7693 | Зарегистр. 08-09-2001 | Отправлено: 14:05 12-02-2020
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Окончания строк. Оба оппонирующих тут говорят, в общем-то, об одном и том же. Поэтому не понятно к чему столько много букаф. В реальной жизни я тоже использую шаблон [^\r\n]. Он действительно, наиболее безотказный для меня и работает практически везде консистентно. Поэтому в этой части я соглашусь с одним из оппонентов, если мы говорим об универсальности. Это что касается содержания. Но по форме это уже традиционный :facepalm:
     
    На самом деле, при работе с определённым файлом, важно понимание 3-х вещей:
    1) Как обстоят дела в исходнике (один из стандартов, либо их смесь)
    2) Как в этом плане ведёт себя конкретный редактор, в котором ведётся обработка файла
    3) Каков должен быть результат.
     
    Если есть чёткое понимание всего вышеперечисленного, то ошибок никогда не возникнет.
     
    К примеру реальный случай. У меня есть группа файлов, заточенных на определённый формат, где \n должна чередаваться с \r\n. И конечно это необходимо учитывать при составлении регэксп-ов. Если редактор "обобщает", то он вряд ли подойдёт для решения этой задачи. По крайней мере без дополнительных ухищрений.

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

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А как задать строку нач. &hl= и до табуляции?
     
     
     
    AKLEPAD

    Всего записей: 1329 | Зарегистр. 27-11-2008 | Отправлено: 16:48 12-02-2020
    YuS_2



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

    Цитата:
    А как задать строку нач. &hl= и до табуляции?  
    AKLEPAD

    Очень краткое условие... если буквально, то:

    Код:
    &hl=[^\n\t]*

    если указанные символы должны быть в начале строки, то:

    Код:
    ^&hl=[^\n\t]*

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:17 12-02-2020
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2 написал(а)
    Цитата:
    &hl=[^\n\t]*

    Разве не  

    Код:
    &hl=[^\n]*(?=\t)

    ?
    Или если быть более строгим с окончанием строк (хотя выше вы уже писали, что Акел считает это одним и тем же)

    Код:
    &hl=[^\n\r]*(?=\t)

    Просто ваша регулярка сработает и на строку если в ней символа табуляции нет вообще. Тестировал на таком куске текста:

    Код:
    &hl= и до табуляции? dd
    &hl=        и до табуляции?

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 17:26 12-02-2020 | Исправлено: regist123, 17:33 12-02-2020
    YuS_2



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

    Цитата:
    Просто ваша регулярка сработает и на строку если в ней символа табуляции нет вообще.

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

    Код:
    &hl=[^\n\t]*(?=\t)

    или даже так:

    Код:
    &hl=[^\n\t]*+(?=\t)

    что будет гораздо быстрее и по количеству шагов меньше, по сравнению с шаблоном "[^\n]*(?=\t)", который сначала захватит всю строку, а потом пошагово будет откатываться, в поисках совпадения... чего не будет в случае исключения табуляции из проверки "[^\n\t]*".
     

    Цитата:
    если быть более строгим с окончанием строк  

    Редактор указан, поэтому некритично... а в данном, конкретном случае, в других современных редакторах тоже не будет иметь большого значения, т.к. \n - вполне достаточен в таком шаблоне для исключения захвата символов в более чем одной строке... то бишь, сочетание \r\t\n, в конце строк, в нормальном тексте, недопустимо.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:31 12-02-2020 | Исправлено: YuS_2, 18:38 12-02-2020
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Совет общего вида ВСЕМ НЕДОСТАТОЧНО ОПЫТНЫМ ЮЗЕРАМ
     
    в большинстве случев (особенно  в случае замен/удалений), если используемый регэксп имеет фрагмент вида (положительное или отрицательное (^) перечисление/группа символов в любых вариациях наличия и количества ([...]?, [...]*, [...]+, [...]{x,у} и т.д.),
     
    ...[...\n...]...
     
        где ... - любая комбинация (не содержащая \r или \s) или ничего, например, фрагменты [\n], [\n\t], [a-z\n], [abc\n=] и т.д.
     
    то стоит добавить в него сиимвол \r
     
    (чтобы получилось [\n\r], [\n\r\t], [a-z\n\r], [abc\n\r=] и т.д.)
     
    Этим самым вы избежите в будущем потенциальных проблем, описанных выше (отсюда и до данного сообщения, с живыми примерами).
     
    Совет дан ввиду того, что иные помощники упорно предпочитают оказывать точечную помощь, чтобы их советы помогали, как можно меньшему количеству людей и как можно в меньшем количестве случаев (видимо, боятся,  что в противном случае о них забудут, если они перестанут бегать по кругу с одними и теми же сопливчиками, лишь переворачивая их с одной стороны на другую).
     
    * * *

    Цитата:
    сочетание \r\t\n, в конце строк, в нормальном тексте, недопустимо

    Пример "ненормального" текста с "недопустимыми" сочетаниями:
    https://www102.zippyshare.com/v/hVraUOmN/file.html
    Наверное он просто не знает, что он "ненормальный", а потому даже в браузере не испытывает проблем с работой.

    Всего записей: 1375 | Зарегистр. 17-01-2011 | Отправлено: 21:28 12-02-2020 | Исправлено: Jonmey, 23:02 12-02-2020
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем неопытным юзерам: не слушайте некоторых шибко "умных" советчиков на форумах, лучше поизучайте регулярные выражения, как минимум, по книгам, ссылки на которые есть в шапке данного топика. В которых, нормальные авторы, часто рекомендуют не составлять монструозные шаблоны, лучше разбивать их на несколько простых (это гораздо эффективнее).
    Затем уже, изучайте более глубоко, по первоисточникам используемых инструментов, кроме того всегда можно обратиться к спецификации PCRE здесь, например, т.к. де факто, в основном (не все, конечно, но многие) движки регэкспов отталкиваются именно от PCRE.
     
    А искусственно созданные корявые тексты... по рукам надо бить за такие корявости и не использовать редакторы, которые "умеют" делать такие "грабли".
    А нормальные редакторы, как например AkelPad, умеют эти грабли выправлять одним движением, достаточно сохранить такой суперсделанный документ, предварительно выбрав другой формат окончаний строк, отличный от автоопределившегося (при необходимости, затем можно вернуть тот же формат и сохранить документ повторно).
    По поводу универсальных регулярных выражений: составить такое "чудесное чудо" не получится, особенно при использовании различных инструментов. А чтобы убедиться в этом, достаточно изучить вопрос наличия различных диалектов регэкспов и всякое желание универсализации, после этого пропадет, как страшный сон.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:55 13-02-2020 | Исправлено: YuS_2, 09:02 13-02-2020
    Romul81



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

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

    Никоим образом не хочу ввязываться в ваш междусобойчик, но вот это зацепило. Поймите, задачи бывают разные. Пример. Файл-исходник для компиляции словаря в формате mdx (mdict). Унего есть определённая словарная структура. Разграничитель статей должен в обязательном порядке заканчиваться последовательностью CR LF. В том время как внутри статей может быть множество переводов строк в виде LF. Сами статьи - это как правильно HTML-код, который может быть очень объёмным. После обработки такого файла в "нормальном" редакторе вся эта логика летит к чертям. Так что, "нормально" и "ненормально", как и всё в жизни, очень относительно... Поменьше категоричности... И побольше терпимости к мнению других.. Пожалуйста...

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 01:55 14-02-2020
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот, сразу видно - человек кое-что подержал в руках, кроме учебных задачек. Потому не пытается подстраивать реалии, под теории живущие в отдельно взятой черепной коробке.
     
    Romul81
    Аналогично с html страницами. Нередко сталкивался с проблемами из-за типов концов строк. Возникают из-за ошибок в скриптах движка - подкорректируют на сервере на скорую руку или еще как, не стандартизировав концы строк, и потом может годами они тянуться эта беда на страницах. Начинаешь редактировать - бац - регэксп не работает, как надо, хотя вроде все правильно. Чтобы не гоняться за подобными казусами по отдельности, приходится писать регэксы заведомо учитывающие все варианты, чтобы потом не кусать локти (сегодня со страницей порядок. а завтра уже внесли изменения, а регэкспны к этому не готовы...).

    Всего записей: 1375 | Зарегистр. 17-01-2011 | Отправлено: 07:14 14-02-2020 | Исправлено: Jonmey, 09:35 14-02-2020
    YuS_2



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

    Цитата:
    Поймите, задачи бывают разные. Пример. Файл-исходник для компиляции словаря в формате mdx (mdict). Унего есть определённая словарная структура. Разграничитель статей должен в обязательном порядке заканчиваться последовательностью CR LF. В том время как внутри статей может быть множество переводов строк в виде LF. Сами статьи - это как правильно HTML-код, который может быть очень объёмным. После обработки такого файла в "нормальном" редакторе вся эта логика летит к чертям.

    Естественно. Если задача специфична, а приведенный пример уж очень специфичен, т.к. использование различных форматов для обозначения окончаний строк и окончаний статей, LF и CR LF (что кстати является тяжелым наследием механических печатных машинок), для любого редактора, используемого в широких целях, является конкретными граблями. То бишь для узкоспециализированных задач и редакторы должны быть узкоспециализированными. Не совсем понятно для чего разработчики таких словарей, сами своими руками создают "грабли"... но это уже другой вопрос.

    Цитата:
    Так что, "нормально" и "ненормально", как и всё в жизни, очень относительно... Поменьше категоричности... И побольше терпимости к мнению других.. Пожалуйста...

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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 07:50 14-02-2020
    gerxer

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как подкорректировать регулярку "^\s+|\s+$", чтобы если есть в начале знаки вопроса удаляла их.  Используется в AHK для изменения содержащегося в буфере обмена.  
    Clipboard := RegexReplace( Clipboard, "^\s+|\s+$" )

    Всего записей: 565 | Зарегистр. 19-06-2014 | Отправлено: 14:30 18-02-2020
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gerxer написал(а)
    Цитата:
    если есть в начале знаки вопроса удаляла их.

    расплывчатая формулировка. Вначале чего? Строки?
    Лучше приведите пример текста и что из него надо получить.

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 15:22 18-02-2020
    Zerooo



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите регуляркой найти искомую подстроку в исходном тексте, если искомая подстрока может быть разорвана фиксированной вставкой в любом месте (искать без использования языков программирования, например в Notepad++).
     
    Например найти v.Nat_List_ID в следующих вариантах текста:
     
    _____'where v.VagonID=:VagonID and v.Vypis_ID is null and v.Nat_List_I' +
    _____'D is null and v.Block<>1')
    _____'protects Windows, Mac and Android'

     
    _____'where v.VagonID=:VagonID and v.Vypis_ID is null and v.Nat_' +
    _____'List_ID is null and v.Block<>1') protects Windows, Mac and Android'

     
    Искомая подстрока естественно может быть разной.
    Составил регулярное выражение http://regex101.com/r/HsPbTl/1, оно вырезает ненужную часть, но как запустить "второй проход" для поиска v.Nat_List_ID по "откорректированному" тексту...?

    Всего записей: 94 | Зарегистр. 18-07-2003 | Отправлено: 17:51 18-02-2020
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zerooo написал(а)
    Цитата:
     как запустить "второй проход" для поиска v.Nat_List_ID по "откорректированному" тексту...?


    Цитата:
     например в Notepad++

    В Notepad++ можно написать макрос и он будет по очередно запускать два поиска. Сначала вырезать не нужное, а потом уже искать ваше вхождение.

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 18:38 18-02-2020
    gerxer

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regist123
    Например сейчас это выражение "^\s+|\s+$" удаляет все пробелы в начале(и ещё что-то уже не помню), то есть если скопировалось в буфер " ABC", то будет "ABC".  
    А мне надо чтобы ещё если скопировал "??ABC", то чтобы в буфере было "ABC", те  знаки вопроса удалял.  

    Всего записей: 565 | Зарегистр. 19-06-2014 | Отправлено: 18:47 18-02-2020
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gerxer
    Напр.
    ^[\s\?]+|[\s\?]+$
    Если нужно удалять только пробелы и табуляции, то я бы не стал использовать \s
    а использовал явное перечисление, что безопаснее
    ^[ \?\t]+|[ \t\?]+$
    Удаление ? только в начале, а пробельных символов на обоих концах строки:
    ^[\s\?]+|\s+$
    Из вашей формулировки задачи неясно
    нужно ли удалять любые комбинации ? и \s, например
    ?? ? слово
    ? ?слово
    или нужно удалять символы одного типа - либо ?, либо \s
    ??слово
      слово
    ???слово
        слово
    Для второй задачи регэксп будет другой и он будет сложнее, например
    ^\?++(?!\s)|^\s++(?!\?)|\s+$
     
    Zerooo
    рекомендую использовать powergrep для многошаговых операций с регэкспами. Сможете осуществлять не только многошаговые операции в рамках одного типа действий (напр., или замена, или извлечение данных и т.д.), но и цепочки из многошаговых действий разных типов и любой длины за один проход.

    Всего записей: 1375 | Зарегистр. 17-01-2011 | Отправлено: 19:20 18-02-2020 | Исправлено: Jonmey, 20:02 18-02-2020
    YuS_2



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

    Цитата:
    Составил регулярное выражение http://regex101.com/r/HsPbTl/1, оно вырезает ненужную часть

    Оно слишком частное, вырежет однократно, в одном месте и всё на том...
    Лучше так, если вставка фиксированная...
     
    а второй проход - должен поддерживаться редактором... например, в AkelPad есть скрипт FindReplaceEx.js, позволяющий применять шаблоны пакетами (до 9 пакетов), в каждый пакет можно добавлять последовательность применяемых шаблонов, т.е. проходов различных шаблонов может быть и более двух, при необходимости.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:40 18-02-2020
    gerxer

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Jonmey
    Не работает. И вопросы оставляет если пробелов нет, и пробелы оставляет если добавить.
    ??  ABC так и остается.

    Всего записей: 565 | Зарегистр. 19-06-2014 | Отправлено: 20:05 18-02-2020
    Открыть новую тему     Написать ответ в эту тему

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