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

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


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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 22:20 25-03-2020
    Romul81



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

    Цитата:
    Но хотелось бы также понять, почему предсказуемое группирование при
    (?=(\d+)\/?(\d*)")
    становится не таким предсказуемым при
    (?<=(\d+)\/?(\d*)")

    Потому что право не равно лево. В первом выражении отрабатывает только (\d+) (при отсутствии слеша), т.к. всё остальное является необязательным.
    Во втором случае отрабатывает (\d*) - движок же смотрит назад от позиции!. Если слеша нет, то в эту группу попадают все имеющиеся цифры. Далее, наличие слеша игнорируется и отдаётся одна минимально необходимая цифра для первой группы.
    RegexBuddy в режиме дебаггинга всё это может показать.
    Но вообще ваши регулярки составлены неверно. Вот эта вся "неоднозначность" предполагает адовое количество бэктреков.
    Двигайтесь от простого к сложному. Что вы ищите?
    - обязательно - целое число
    - факультативно - слеш и число
    У вас есть как бы две половинки.
    Jonmey подсказал правильный вариант. Я бы только его чуть изменил, чтоб сохранить нумерацию групп:

    Код:
    (?<=(\d+)(?:/(\d+))?")

    но это только начало... Ведь значения в дюймах могут быть больше чем один дюйм, и иметь при этом дробное значение. Напр.
    2 3/4"
    и т.д. Хотя, может это и не ваш случай.
    И кстати, почему у вас 1" = (2.54 mm)?.. Я всегда думал, что это сантиметры...
     
    Добавлено:
    YuS 2

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

    В новом Javascript это не так. Причём в старом так тоже не было. Потому что lookbehind вообще не было.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 22:23 25-03-2020
    YuS 2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81 (пост)
    Цитата:
    В новом Javascript это не так.

    Возможно. Смотрел в PCRE первоисточнике...

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 22:48 25-03-2020
    Romul81



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

    Цитата:
    Смотрел в PCRE первоисточнике

    Да, в PCRE это действительно так. Но на то они и диалекты, что имеются такие различия. Кстати, это - далеко не единственное.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 22:53 25-03-2020
    Mavrikii

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

    Код:
    const convert = str => str.replace(/(\d+\s+)?(\d+)\/?(\d*)"/g, (_, g1, g2, g3) => _ + ` (${(g1 || 0) * 2.54 + g2 / (g3 || 1) * 2.54} cm)`);

    или

    Код:
    const convert = str => str.replace(/(\d+\s+)?(\d+)\/?(\d*)"/g, (_, g1, g2, g3) => _ + ` (${((g1 || 0) * 1 + g2 / (g3 || 1)) * 2.54} cm)`);

    дополнительное умножение на 1 (или на 2.54 без группировки) - для удаления пробела и смены типа
     

    Цитата:
    1" (2.54 cm)
    1/2" (1.27 cm)
    3/4" (1.905 cm)
    10" (25.4 cm)
    12 1/2" (31.75 cm)

    Всего записей: 15430 | Зарегистр. 20-09-2014 | Отправлено: 22:53 25-03-2020 | Исправлено: Mavrikii, 22:57 25-03-2020
    Romul81



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

    Цитата:
    можно и проще

    Согласен. Рабочее решение. Я сразу не совсем понял для чего используется заглядывание (как вперёд так и назад). Много лет в JS обходились как-то и без него.
    Единственный момент, я бы всё-таки замени регулярку на  
    \b(\d+\s+)?(\d+)(?:\/(\d+))?"
    на тестовых примерах и ваш вариант работает корректно. Но я стараюсь всегда максимально точно написать регулярку, чтоб потом не вылезли косяки на каких-нибудь хитрых стрингах.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 23:56 25-03-2020
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    EmBroidery
    Все уже сделано до нас. Например (и масса другого материала по этой же теме легко гуглится):
    https://stackoverflow.com/questions/29434666/how-to-parse-and-capture-any-measurement-unit/29434667
    Подробнее

    Всего записей: 1365 | Зарегистр. 17-01-2011 | Отправлено: 00:43 26-03-2020
    EmBroidery

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

    Цитата:
    В первом выражении отрабатывает только (\d+) (при отсутствии слеша), т.к. всё остальное является необязательным.
    Во втором случае отрабатывает (\d*) - движок же смотрит назад от позиции!. Если слеша нет, то в эту группу попадают все имеющиеся цифры. Далее, наличие слеша игнорируется и отдаётся одна минимально необходимая цифра для первой группы

    Теперь стало понятно, спасибо.
     

    Цитата:
    Но на то они и диалекты, что имеются такие различия. Кстати, это - далеко не единственное.

    Могли бы вы подсказать, где можно подробнее с этим ознакомиться?
     
    Jonmey
    Предлагаемая мною задача не имела практического применения.
    Это лишь пример проблемы, с которой я мимоходом столкнулся и не мог для себя объяснить её природы.
     
    Высказанное вами мнение разделяю.

    Всего записей: 20 | Зарегистр. 31-03-2010 | Отправлено: 08:32 26-03-2020 | Исправлено: EmBroidery, 08:49 26-03-2020
    Romul81



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

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

    Comparison of regular-expression engines
    Regular Expressions Reference
    Конкретно по Javascript:
    http://www.regular-expressions.info/javascript.html
    Но надо учитывать, что это один из наиболее динамично развивающихся диалектов. В нём постоянно появляются новые фичи.
    Большинство из выше-приведённых материалов уже неактуальны, если говорить об этом диалекте.
    Поэтому лучше смотреть в документации для для NodeJS.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 18:22 26-03-2020
    relictus

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    UPD: неактуально.
    Можно ли (и как) решить следующие задачи средствами регулярного выражения (PCRE)?
    1) Имеется построчный список (фамилия, имя, отчество) в верхнем регистре, некоторые могут быть сокращенные или состоять из более, чем трех слов, а также (не)иметь различные знаки препинания. Необходимо оставить первые буквы каждого слова в верхнем регистре, остальные преобразовать в нижний. Пример вариантов:
    ШАБАЗЯН АМАЯК АМЛЕТОВИЧ --> Шабазян Амаяк Амлетович    
    ФОМЕНКО А И --> Фоменко А И    
    МУРЗАЕВ НУР-МУХМЕД ЯГМУР-АЛИЕВИЧ --> Мурзаев Нур-Мухмед Ягмур-Алиевич    
    ХАСАНОВ М М --> Хасанов М М    
    ЗУБКО(ШАБАЛДАС) МАЙЯ ВИКТОРОВНА --> Зубко(Шабалдас) Майя Викторовна    
    ИБРАГИМОВ ХАЛИЛ РАСИМ ОГЛЫ --> Ибрагимов Халил Расим Оглы

     
    2) Имеется построчный список адресов (улица, дом, квартира), где улица всегда в верхнем регистре, может быть иметь сокращение или состоять из более, чем одного слова. Необходимо оставить первые буквы каждого слова улицы в верхнем регистре, остальные преобразовать в нижний. Часть адреса после 1-й запятой (т.е. после улицы) должна остаться неизменной. Пример вариантов:
    ЛИТЕЙНЫЙ, 34/1, кв.4 --> Литейный, 34/1, кв.4    
    50 ЛЕТ ВЛКСМ, 4/А, кв.10 --> 50 Лет Влксм, 4/А, кв.10    
    ЛЕНИНА ПЛ., 436, кв.3 --> Ленина Пл., 436, кв.3    
    К.МАРКСА, 8, кв.16 --> К.Маркса, 8, кв.16    
    КОНЕЧНАЯ СТАНЦИЯ, 26/2, кв.53А --> Конечная Станция, 26/2, кв.53А

     
    Доп.вопрос - можно ли составить одну регулярку на обе задачи, если оные решаются?

    Всего записей: 3751 | Зарегистр. 19-04-2005 | Отправлено: 09:11 27-03-2020 | Исправлено: relictus, 10:18 29-03-2020
    Mavrikii

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    relictus
    у многих языков программирования есть такая функция. в общем случае регулярка не может изменять регистр.
    поэтому реализация зависит от конкретного языка.
     
    зы: если пофиг на чем и просто нужно копипастить текст - https://jsfiddle.net/htqrsya7/1/

    Всего записей: 15430 | Зарегистр. 20-09-2014 | Отправлено: 09:16 27-03-2020 | Исправлено: Mavrikii, 10:33 27-03-2020
    relictus

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mavrikii
    Спасибо. На ЯП довольно легко решается, хотелось узнать возможность сделать это регуляркой (мало знаком). Но раз нет, так нет...

    Всего записей: 3751 | Зарегистр. 19-04-2005 | Отправлено: 10:40 27-03-2020
    los

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    relictus,
    для варианта с ФИО можно решить при помощи sed.

    Всего записей: 7645 | Зарегистр. 08-09-2001 | Отправлено: 13:00 27-03-2020
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    relictus
    1. и 2. Можно. Но зависит от вашей цели - результат или метод вам нужен.
    Если раньше тут никто не сподобится, то пишите в ПМ, обсудим.

    Всего записей: 1365 | Зарегистр. 17-01-2011 | Отправлено: 17:30 28-03-2020
    VitRom

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    relictus, ВЛКСМ => Влксм таки неправильно есличо

    Всего записей: 3109 | Зарегистр. 18-06-2006 | Отправлено: 12:58 29-03-2020
    YuS 2



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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 14:33 29-03-2020 | Исправлено: YuS 2, 14:33 29-03-2020
    fromes

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    При написании небольшого парсера поисковой системы возникал проблема с регулярным выражением:
     
    Есть регулярное выражение для парсинга HTML страницы:
     
    var pattern = @
    <div class="A(.*?)(href=")(?<href>.*?)"(.*?)<div class="B">(?<anchor>.*?)<.*?><div class="C yDYNvb">(?<sniplet>.*?)</div>
     
    при парсинге страницы все работает.
     
    Но если происходит смена дизайна на странице, например: <div class="B заменяется на <div class="K ,то происходит Catastrophic backtracking и начинает зависать парсер.
     
    Задача: подкорректировать регулярное выражение так, чтобы в выше указанном случае смены дизайна страницы не происходило возврата Catastrophic backtracking, а парсер просто переставал искать (Ничего не найдено или ошибка)
     
     
    Заранее благодарен за помощь

    Всего записей: 1 | Зарегистр. 09-04-2020 | Отправлено: 17:45 09-04-2020
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    fromes
    Какой язык/библотека используются для парсинга?
    Примеры оригинальной страницы (где находится резльтат) и изменённой (где не должен находиться) тоже желательны.
    Безотносительно этого - HTML регулярными выражениями не парсится.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 22:25 09-04-2020
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    fromes
    Потому что
    .* - крайне опасное выражение, особенно при парсинге html страниц. Я писал об этом выше.
    А в вашем выражении их - аж 6 штук.
    То есть, потенциальное количество вариантов для достаточной сложной и большой по размеру страницы может быть невероятным, отсюда и почти бесконечный бэктракинг при малейшем изменении страницы.
    Нужно учиться писать регэкспы без этого выражения, тогда таких проблем не возникнет.
    При простых построчных обработках в текстах использование этого выражения не столь критично, но априори его использование приводит к самому медленно выполняемому регэкспу.
    Для HTML с его плавающими переносами/разрывами строк, количества пробелов/табуляций, нередко неоднообразными окончаниями строк и т.д. подобные "слепые" выражения в регэкспах - всегда чреваты.

    Всего записей: 1365 | Зарегистр. 17-01-2011 | Отправлено: 08:12 10-04-2020 | Исправлено: Jonmey, 08:13 10-04-2020
    VladimirErshoff

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вроде задача простая, но я новичок и сообразить не могу. Нужно взять все до знака "=", исключая сам знак. Например
    из
    "Value"="Deny"
    нужно получить
    "Value"
    т.е. не удалить все, что после "=" вместе с ним (это я могу), а взять все до.

    Всего записей: 16 | Зарегистр. 09-04-2020 | Отправлено: 06:32 13-04-2020 | Исправлено: VladimirErshoff, 06:47 13-04-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