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

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

Открыть новую тему     Написать ответ в эту тему

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
    Mavrikii

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

    Код:
    <record.*>\n\s*((?!<\/record>).+)\n\s*<\/record>

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

    Код:
    <record.*>\n\s*([^<]+)\n\s*<\/record>

    Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 22:02 06-04-2021 | Исправлено: Mavrikii, 22:11 06-04-2021
    PryMan



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

    Цитата:
    если в принципе не может быть в тексте <
    Может быть и <
     

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

    То, что нужно! Огромное спасибо!

    Всего записей: 132 | Зарегистр. 01-08-2018 | Отправлено: 22:07 06-04-2021
    Mavrikii

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

    Цитата:
    То, что нужно! Огромное спасибо

    если вам нужны будут ID и пустых записей, а также возможен вариант, когда нет пробелов и тд и тп, то лучше так

    Код:
    <record.*>(\n\s*(.+)\n)?\s*<\/record>

    Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 22:19 06-04-2021 | Исправлено: Mavrikii, 22:23 06-04-2021
    PryMan



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

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

    Этого выражения совсем не понял :)
    Да и тест выделяет найденное не зелёным, как обычно, а оранжевым. Не знаю, что бы это могло значить.
    https://regex101.com/r/JkZr1T/2
     
    Но спасибо, записал. Буду пробовать уже непосредственно в Питоне.  

    Всего записей: 132 | Зарегистр. 01-08-2018 | Отправлено: 22:34 06-04-2021 | Исправлено: PryMan, 22:38 06-04-2021
    Mavrikii

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

    Цитата:
    Этого выражения совсем не понял

    если форматирование текста будет без пробелов до/после тегов, а также нужно будет вытащить атрибуты тега record (ID, dataID и так далее).
    то есть ситуация вида <record ID="0" dataID="0x0"></record>

    Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 22:38 06-04-2021
    PryMan



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

    Цитата:
    если форматирование текста будет без пробелов до/после тегов

    Не-не, такого не будет. Форматирование строго соблюдается.

    Всего записей: 132 | Зарегистр. 01-08-2018 | Отправлено: 22:40 06-04-2021
    Mavrikii

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

    Цитата:
    Да и тест выделяет найденное не зелёным, как обычно, а оранжевым. Не знаю, что бы это могло значить

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

    Код:
    <record.*>\n\s*(.*)\n\s*<\/record>

    есть еще вопрос - перенос строки в тексте возможен?
     
    лучший вариант

    Код:
    <record[^>]*>\s*(.*?)\s*<\/record>

    с модификатором s в регулярке, чтобы точка включала и перенос строки.
    https://regex101.com/r/kTSNpN/1

    Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 22:46 06-04-2021 | Исправлено: Mavrikii, 23:16 06-04-2021
    harrykkk



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

    Цитата:
    Форматирование строго соблюдается

    Все варианты кроме последнего от Mavrikii во второй строке захватывают последний пробел. Но этот пробел не значение тега, а последний пробел отступа. Вас такое устраивает?

    Всего записей: 9020 | Зарегистр. 24-02-2013 | Отправлено: 22:55 06-04-2021
    Fenrizz



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    PryMan
    Вообще-то XML лучше разбирать специальными средствами, а не регулярными выражениями

    Код:
    import xml.etree.ElementTree as ET
    root_node = ET.parse('sample.xml').getroot()
    # print(root_node)
    for tag in root_node.findall('.//record'):
         print(tag.attrib['ID'], end='')
         print(tag.text, end='')
     
     
    Это если на Python, если в командной строке, то можно использовать Xmllint, про который я писал выше.

    Всего записей: 677 | Зарегистр. 12-09-2017 | Отправлено: 09:22 07-04-2021 | Исправлено: Fenrizz, 14:00 07-04-2021
    harrykkk



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

    Цитата:
    Вообще-то XML лучше разбирать специальными средствами

    Согласен. Вчера решил эту задачку похожим образом.
    records.xml ->

    Код:
    <root>
      <records>
        <record ID="0" dataID="0x0">
           
        </record>
        <record ID="1" dataID="0x0">
          тут может быть всё, что может быть напечатано
        </record>
        <record ID="2" dataID="0x0">
          тут может быть всё, что может быть напечатано
        </record>
      </records>
    </root>

    records.py ->

    Код:
    from lxml import etree
     
    root_tree = etree.parse('records.xml')
    records_list = root_tree.findall('*/record')
     
    records_str = ''
    for elem in records_list:
        elem_str = '{} - {}\n'.format(elem.get('ID', default=None), elem.text.strip())
        records_str = records_str + elem_str
     
    with open('records.txt', 'w', encoding="utf-8") as f:
        f.write(records_str)
     
    # print(records_str)

    Результат records.txt ->

    Код:
    0 -  
    1 - тут может быть всё, что может быть напечатано
    2 - тут может быть всё, что может быть напечатано

    Всего записей: 9020 | Зарегистр. 24-02-2013 | Отправлено: 18:56 07-04-2021 | Исправлено: harrykkk, 18:58 07-04-2021
    PryMan



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

    Цитата:
    есть еще вопрос - перенос строки в тексте возможен?

    Да, вообще-то возможен. Забыл об этом. Спасибо, учту.
     
    Fenrizz, harrykkk

    Цитата:
    Вообще-то XML лучше разбирать специальными средствами, а не регулярными выражениями

    В общем-то согласен, но помучавшись не несколькими кривыми документами решил забить на это дело.
    Нужно отлавливать ошибки при отсутствии нужных записей, иногда парсер (lxml) вообще отказывается загружать XML по непонятным причинам и т.д и т.п.  
    lxml тоже использую, но в некоторых случаях регулярки работают стабильнее и понятнее.
    Чистое ИМХО. На прямоту рук не претендую :)
     
     
     
    Добавлено:
     
    harrykkk

    Цитата:
    Все варианты кроме последнего от Mavrikii во второй строке захватывают последний пробел.

    Обработав несколько документов не заметил ничего лишнего.
    Спасибо за инфу, понаблюдаю за этим повнимательнее.

    Всего записей: 132 | Зарегистр. 01-08-2018 | Отправлено: 00:35 08-04-2021 | Исправлено: PryMan, 00:36 08-04-2021
    harrykkk



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

    Цитата:
    не заметил ничего лишнего

    Если вы используете регулярки из этого поста, то ничего и не заметите. Там всё нормально

    Всего записей: 9020 | Зарегистр. 24-02-2013 | Отправлено: 07:24 08-04-2021
    kvark484kvark484

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, что на что менять для удаления ссылок, но с сохранением текста, т.е. чтобы было вместо:
    Прикладное программирование
    просто:  
    Прикладное программирование
    Ссылок много и они все разные.

    Всего записей: 464 | Зарегистр. 26-03-2016 | Отправлено: 12:26 16-04-2021 | Исправлено: kvark484kvark484, 12:51 16-04-2021
    los

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

    Всего записей: 7311 | Зарегистр. 08-09-2001 | Отправлено: 13:29 16-04-2021
    kvark484kvark484

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

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

    Notepad++

    Всего записей: 464 | Зарегистр. 26-03-2016 | Отправлено: 15:11 16-04-2021
    Werty666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ума не приложу
    Имеется строка (Brazil • Bastos, Sao Paulo • 2009) (Thrash Metal/Crossover)
     
    задача самая простая - поменять местами фразы в скобках, делаю так (.+) (.+) заменить на $2 $1
     
    почему-то, если встречается пробел во вторых скобках получается вот
     
    Metal/Crossover) (Brazil • Bastos, Sao Paulo • 2009) (Thrash
     
    перепробовал все \s\w\d   ... никак
     

    Всего записей: 369 | Зарегистр. 20-07-2008 | Отправлено: 17:39 16-04-2021 | Исправлено: Werty666, 17:40 16-04-2021
    DrakonHaSh



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Werty666
    Не понятно где конкретно вы пробуете эту замену,  
    вот вам пример на c#: https://dotnetfiddle.net/JIPblt  
    a вот на js: https://jsfiddle.net/DrakonHaSh/t7m2Lqsf/2/
    Выражение ваше не коррректно составлено и то, что оно хоть как-то частично работает, это странноватое совпадение.
    Вот корректный вариант:

    Код:
    var str = "(Brazil • Bastos, Sao Paulo • 2009) (Thrash Metal/Crossover)";
    var reg = /(\([^\)]*\)) (\([^\)]*\))/;
    var result = str.replace(reg, "$2 $1");

    Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 19:00 16-04-2021 | Исправлено: DrakonHaSh, 19:13 16-04-2021
    Werty666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DrakonHaSh спасибо большое, подошел 2-й вар., я спрашивал для TCIMG, такая расширяющая функционал total commander утилита командной строки
     
     
    Добавлено:
    еще вот что - если имеются скобки в скобках
     
     
    (Canada • Montreal, Quebec • 1991) (Death Metal (early); Melodic Death Metal (later))
     
    вместо желаемого результата получается
     
    (Death Metal (early) (Canada • Montreal, Quebec • 1991); Melodic Death Metal (later))
     
    как можно дополнить регулярку, чтобы была универсальной, для обоих вариантов?

    Всего записей: 369 | Зарегистр. 20-07-2008 | Отправлено: 19:32 16-04-2021 | Исправлено: Werty666, 19:58 16-04-2021
    DrakonHaSh



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

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


    Код:
    var str1 = "(Brazil • Bastos, Sao Paulo • 2009)(Thrash Metal/Crossover)";
    var str2 = "(Canada • Montreal, Quebec • 1991)  (Death Metal (early); Melodic Death Metal (later))";
    var reg = /(.*)\)\s*\((.*)/;
    var result1 = str1.replace(reg, "($2 $1)");
    var result2 = str2.replace(reg, "($2 $1)");

    разбивает строку на 2 части считая разделителем ') 0 или более пробелов ('

    Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 20:10 16-04-2021
    Werty666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DrakonHaSh ага, этот вариант пашет. Я тоже пробовал с \s* только + ставил вместо звезды, мне непонятно 0 последовательностей или 1 и более, Спасибо
     
     
    Добавлено:
    DrakonHaSh
     
    не сочтите за наглость, еще одна проблема - используя Ваш код я пытался еще кой чего сделать - содержимое третьих скобок переместить вперед
     
    (Century Media) (CM 19439786782) (CD, Album, CD, All Media, Limited Edition) (Europe) (20 Nov 2020) (Rock) (Melodic Death Metal)
     
    \((.*)\)\s*\((.*)\)\s*\((.*)\)\s*\((.*)\)
     
    $3$1$2$4$5$6$7
     
    не работает((( экранировал экранировал недоэекранировал

    Всего записей: 369 | Зарегистр. 20-07-2008 | Отправлено: 20:24 16-04-2021 | Исправлено: Werty666, 22:54 16-04-2021
    Открыть новую тему     Написать ответ в эту тему

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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru