Автор Тема: Обсуждение уроков по работе с Регулярными Выражениями (RegExp)  (Прочитано 14863 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Redline [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 506
  • Репутация: 369
  • Пол: Мужской
    • Награды
axlwor
Будет еще один небольшой урок и уже после этого все уроки перекочуют в отдельную тему без комментариев и думаю там можно будет обойтись без ссылок  ;)
AZJIO
Спасибо за замечания.

Всем вопрос:
можно ли в предпоследний пример в последнем уроке решить задачу одним выражением? У меня есть мысль - сделать обратную ссылку на вертикальную табуляцию (или ее отсутствие) и потом вставлять ее перед запятой  :wacko:, но реализовать не удалось.
Тому кто сможет решить - медаль  :sorcerer:
« Последнее редактирование: Июнь 11, 2011, 17:26:46 от CreatoR »
Уроки по регулярным выражениям на AutoIt: RegExp

Русское сообщество AutoIt


Оффлайн focus [?]

  • Осваивающий
  • **
  • Сообщений: 69
  • Репутация: 20
    • Награды
Дополню данную "КОПИЛКУ !!" небольшёй поправкой. Пример1 способ 3.Да, в таком виде - проблема в кодировке. Попробовал так
Код: AutoIt [Выделить]
$sUrl = 'http://www.gismeteo.ru/city/daily/5002/'
$sHTML = BinaryToString(InetRead($sUrl), 4)
ConsoleWrite($sHTML & @CRLF)

Стало правильно (по русски) показывать. P.S. Увидел здесь http://autoit-script.ru/index.php?topic=5527.msg39557#msg39557

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
очень странный топик, никогда с первого раза не грузит всю страницу. надо как минимум 1 раз обновлять, а то и больше
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Русское сообщество AutoIt


Оффлайн axlwor [?]

  • Скриптер
  • ****
  • Сообщений: 657
  • Репутация: 147
    • Награды
обещают закрыть  :D

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
С этого момента эта тема только для обсуждений уроков, сами уроки переехали сюда.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн Redline [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 506
  • Репутация: 369
  • Пол: Мужской
    • Награды
AZJIO
Хорошие замечания!
Но я не могу вносить изменения в ту тему  :wall_brake:

Модераторы/Администраторы пожалуйста подправьте здесь Урок 2 / Метасимволы.Дополнительные
TitleBox"\b" - граница слова (например, буква "b" и "g" в слове "boring" находятся на границе, а буквы "orin" нет). Работает только для букв английского алфавита!
TitleBox"\W" - не символ буквы "слова" - все что не попало в "(a-zA-Z0-9_)", т.е. русские буквы, символы пробелов, символы пунктуации и пр.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Redline
Поправил.

Оффлайн Redline [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 506
  • Репутация: 369
  • Пол: Мужской
    • Награды
AZJIO
Укажи какие теги использовать для заголовков тем/подтем (h1/h2 подойдут?) и спойлеров.
Лучше в личку.

Русское сообщество AutoIt


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2740
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
В новой справке добавились метасимволы:
(?J) - allow duplicate names (разрешает дубликаты/двойные названия).
\K - reset start of match.
\G - first matching position in subject
\N - [^\n] Любой символ, который не символ перехода на новую строку (не @LF). Не работает в 3.3.6.1
\R - [\n\f\r\v] Chr(10), Chr(11), Chr(12), Chr(13) любой из символов переноса строки

Некоторые ((?J), \K, \G) не понял пока для чего...

Кроме того для \s и для классов типа [[:upper:]] сделал поправки указав конкретные диапазоны символов.

Вот тестовый скрипт для определения захвата символов

(нажмите для показа/скрытия)

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
AZJIO  [?]
Цитировать
Некоторые ((?J), \K, \G) не понял пока для чего...
\G это вроде обратное от \g, что означает глобальный поиск. В данном случае \G предотвращает глобальное совпадение, т.е ищет только первое.

Оффлайн Redline [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 506
  • Репутация: 369
  • Пол: Мужской
    • Награды
AZJIO  [?]
Цитировать
(?J) - allow duplicate names (разрешает дубликаты/двойные названия).
Фридл
Цитировать
Python и языки .NET позволяют сохранить текст, совпавший с круг
лыми скобками, под заданным именем. В Python используется син
таксис (?Р<имя>…), а в языках .NET – синтаксис (?<имя>…) (лично
мне этот вариант нравится больше).
В 3.3.6.1 версии возможности именовать подшаблоны я не видел или плохо смотрел.
А флаг (?J) позволяет использовать одно имя для разных шаблонов.

Цитировать
В Python и .NET (но не в PHP) допускается многократное использова
ние имен в выражениях. Например, если код междугородной связи
в телефонном номере записывается в виде ‘(###)’ или ‘###-’, для
его поиска можно воспользоваться следующим выражением (исполь
зован синтаксис .NET): …(?:\((?<Area>\d\d\d)\)|(?<Area>\d\d\d)-)… Ка
кая бы из альтернатив ни совпала, код из трех цифр будет ассоцииро
ван с именем Area.

Цитировать
\G - first matching position in subject
Фридл
Цитировать
Метасимвол \G впервые появился в Perl и предназначался для проведе
ния глобального поиска с модификатором /g . Он совпадает с по
зицией, в которой завершилось предыдущее совпадение. При первой
итерации \G совпадает только в начале строки, как и метасимвол \A.

Если попытка поиска завершилась неудачей, позиция \G возвращается
в начало строки. Таким образом, при многократном применении регу
лярного выражения (как при использовании команды s/…/…/g или дру
гих средств глобального поиска) неудача при очередном поиске приво
дит к сбросу позиции \G для применения следующего выражения.
Тут непонятно, но кажется этот метасимвол позволяет сохранить позицию от предыдущего поиска при глобальном поиске  :wacko:

Цитировать
\K - reset start of match.
Здесь могу ошибаться, но вроде оно:
Цитировать
Обычно в результате неудачной попытки поиска m/…/g позиция pos воз
вращается в начало целевого текста. Но если к модификатору /g доба
вить модификатор /c, неудача не будет приводить к сбросу начальной
позиции поиска.
Похоже в AutoIt при глобальном поиске этот модификатор /c включен сразу и через \K его можно отключать.

Получается это все какие-то экзотические возможности, а вот \R и \N вполне можно употреблять.

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2740
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Redline
Цитировать
Существует ограничение на количество ссылок - максимум 10, обозначение ссылок "$0-$9" или "\0 - \9"
может и существует но не 10, возможно 99, потому что трёхзначные числа /001 это уже восьмеричный код. НО это для ссылок внутри регулярного выражения, хотя можно и так \{200} в случае конфликта. Вот пример с 5460 ссылкой, странное число, может ограничение по длине строки.
Код: AutoIt [Выделить]
$sString = ''
$sPattern = ''
$iEnd = 5460
For $i = 1 To $iEnd
    $sString &= $i & '|'
    $sPattern &= '(\d+\|)'
Next
; MsgBox(0, 'Сообщение', $sString)
; MsgBox(0, 'Сообщение', $sPattern)

$aRes=StringRegExpReplace($sString, $sPattern, '\' & $iEnd)
MsgBox(0, 'Сообщение', $aRes)


Я тоже хотел свой вариант написать, но вдохновения нет. Вот некоторые идеи regexp.7z.
Недостатки в твоём варианте:
1. Имена разделов лучше назвать по их содержанию, например не "Урок 1. Введение", а к примеру "Параметры функций SRE". Потом "Описание метасимволов". Так проще ориентироваться и сразу выбирать нужный раздел для чтения.
2. Флаги 1 и 2 предназначены не просто найти первое вхождение, а сделать последовательный/пошаговый поиск в цикле.
3. Примеры некоторые либо нереальные, либо ...
"удав 11 человек 2 крокодил 4" - человек в перечислении зверей, да ещё на втором месте.
"Берлин Германия|Афины Греция|Москва Россия" - почему Россия последняя.
"Кто убил Лору Палмер? Варианты ответа: а)бомж. б)китаец. в)Девид Линч. г)отец" - не позитивный пример, как будто жизнь построена на убийствах, а дальше перечисление, обзываем человека бомжом, далее националистический выбор... сплошной непозитив.

Оффлайн Redline [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 506
  • Репутация: 369
  • Пол: Мужской
    • Награды
AZJIO  [?]
Цитировать
может и существует но не 10, возможно 99, потому что трёхзначные числа /001 это уже восьмеричный код. НО это для ссылок внутри регулярного выражения, хотя можно и так \{200} в случае конфликта. Вот пример с 5460 ссылкой, странное число, может ограничение по длине строки.
Я так далеко не закапывался и даже не помню откуда взялись слова про ограничение  :) , но да, получается что можно писать $1... и до упора, а вот со слэшем \1 возможны варианты:
opennet.ruМожно использовать любое количество скобок. Если имеется более 9 подстрок, переменные $10, $11, ... будут ссылаться на соответствующую подстроку. В шаблоне \10, \11 и т.д. ссылаются на уже сопоставленные подстроки, если их уже было столько до этой обратной ссылки. В противном случае (для обратной совместимости) \10 совпадает с \010, или символом забоя, а \11 совпадает с \011, символом табуляции. И так далее. (Последовательности от \1 до \9 всегда рассматриваются как обратные ссылки.)
Но не суть, если человеку понадобится больше 10 обратных ссылок, то он делает что-то не так или он сам разберется как ему с ними работать, а 10 - обычному пользователь за глаза хватит.

Если модераторы посчитают данное изменение важным, то вот текст на замену в первом посте обучения (сам я ничего менять не могу  :D):
(нажмите для показа/скрытия)
Цитировать
Я тоже хотел свой вариант написать, но вдохновения нет. Вот некоторые идеи regexp.7z.Недостатки в твоём варианте:1. Имена разделов лучше назвать по их содержанию, например не "Урок 1. Введение", а к примеру "Параметры функций SRE". Потом "Описание метасимволов". Так проще ориентироваться и сразу выбирать нужный раздел для чтения.2. Флаги 1 и 2 предназначены не просто найти первое вхождение, а сделать последовательный/пошаговый поиск в цикле.3. Примеры некоторые либо нереальные, либо ..."удав 11 человек 2 крокодил 4" - человек в перечислении зверей, да ещё на втором месте."Берлин Германия|Афины Греция|Москва Россия" - почему Россия последняя."Кто убил Лору Палмер? Варианты ответа: а)бомж. б)китаец. в)Девид Линч. г)отец" - не позитивный пример, как будто жизнь построена на убийствах, а дальше перечисление, обзываем человека бомжом, далее националистический выбор... сплошной непозитив.

Считаю что не нужно отпугивать новичков непонятными сокращениями и словами сразу с оглавления. Что за SRE, что за метасимволы?
Мое обучение сделано пошагово, чтобы новичок сначала понял для чего это вообще нужно, как с этим работать, что такое шаблон и из чего он состоит, а дальше уже идет кунг-фу для тех кто осилил начало  :)

Да вдохновение это сложно, я вот с примерами дольше всего мучился, поэтому некоторые из них могут быть слегка натянутыми. :whistle: - человек тоже животное, порядок тут не важен как и в географическом тексте, а пример про "Твин Пикс" по-моему очень даже позитивный.

В твоём regexp_error.htm:
"[\w]   \w   Заключение одного символа в символьный класс. В символьный класс имеет смысл заключать 2 и более символов / метасимволов." и пара других примеров - это скорее не ошибки, а недостаток оптимизации/упрощения. Вот кстати можно сделать классный урок или отдельную тему по оптимизации регулярок, но я уже за это точно не возьмусь.

SRE - это какое-то новое сокращение, которое даже не гуглится  ;) , лучше уж оставить RegEx

PS: В твоих файлах нашел пару опечаток: "SPE" в regexp_introduction.htm, "Запсись короче и скорость выше. Или 8 символов проверять или 6, разница есть?" в regexp_error.htm

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2740
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Redline
Вот ссылка с офсайта, текст на английском, но из этого можно было бы сделать уроки. Взять как основу.

Цитировать
Считаю что не нужно отпугивать новичков непонятными сокращениями и словами сразу с оглавления. Что за SRE, что за метасимволы?
Ну что такое SRE можно понять даже по контексту, оно используется в официальной справке и на форуме при общении на офсайте используют, когда тот же новичок будет натыкаться по 10 раз в одном предложении на "регулярные выражения" у него уже тошнить от этого начнёт, думал про сокращение рег.выр. но даже это длинно при 200 кратном использовании, а при опускании существительных текст будет читаться тоже уродливо. На счёт метасимвол, ну в Google введи, любая статья использует этот термин, мне как то интуитивно он был понятен, символы использующиеся не в буквальном смысле, тоже что сказать спец-символы, но метасимвол -устоявшееся понятие.

Цитировать
В твоих файлах нашел пару опечаток
опечатки потом проверю через какую нибудь программу с проверкой орфографии, тот же Word.

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

Цитировать
это скорее не ошибки, а недостаток оптимизации/упрощения
так можно сказать про большинство ошибок, которые там упомянуты. Кстати 5 ошибок из списка мои (я их допускал), остальные найдены у других.

Может статья не должна быть заблокирована от правки? Это же нормально чтобы в любой момент можно было улучшить. Я практически с каждой версией утилиты RegExp делаю правку в сопутствующей справке, каждый раз находя ошибки, последнее удалил строку "{,n} повторить предыдущий символ от 0 до n раз", где то же я её скопировал, но недавно при тесте не мог заставить её работать.

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

regexp.7z - обновил, добавлено одно упражнение и продолжение темы "Группы".
« Последнее редактирование: Май 18, 2013, 17:55:45 от AZJIO »

Alofa

  • Гость
Большое спасибо и огромное уважение всем кто участвовал в написании этих Уроков.
Весь мозг вывернул пока дочитал до конца и понял (ну как мне кажется) все моменты. :wacko:

Обнаруженные недочеты:
(нажмите для показа/скрытия)

В качестве предложения:
(нажмите для показа/скрытия)


И еще:
  • Урок 3. -> Условные подмаски... -> (Спойлер) Условные подмаски
    Цитата: важное замечание
    Есть один неприятный момент - при использовании условных масок (даже при использовании групп без захвата) в вывод попадает все что лежит за условной подмаской и записано в шаблоне, во всяком случае у меня не получилось иначе.
    ...
    Если кто-то найдет решение - прошу написать об этом, но ИМХО тут дело не в условных масках, а в самом механизме RegExp.

    Код 1:
    (нажмите для показа/скрытия)

    Код 2:
    (нажмите для показа/скрытия)

    Из своих наблюдений:
     - Условные подмаски не являются группами назначенными для захвата, т.е. их нужно рассматривать как "(?:...)".

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
259 Ответов
131698 Просмотров
Последний ответ Март 18, 2019, 14:15:25
от ЭйчЭйч
21 Ответов
13428 Просмотров
Последний ответ Август 12, 2011, 16:50:58
от Odinvasya
3 Ответов
4495 Просмотров
Последний ответ Август 18, 2010, 17:25:05
от madmasles
58 Ответов
64495 Просмотров
Последний ответ Апрель 28, 2015, 23:23:16
от Ziggurat
 Закреплено  Обсуждение конкурсов

Автор Medic84 « 1 2 » Конкурсы

23 Ответов
23933 Просмотров
Последний ответ Июль 02, 2012, 10:44:52
от C2H5OH
30 Ответов
18297 Просмотров
Последний ответ Апрель 02, 2012, 03:44:53
от Garrett
7 Ответов
5237 Просмотров
Последний ответ Март 14, 2013, 00:26:06
от Kaster
2 Ответов
5620 Просмотров
Последний ответ Январь 25, 2016, 02:48:12
от CreatoR
0 Ответов
8573 Просмотров
Последний ответ Январь 25, 2016, 02:46:42
от CreatoR
3 Ответов
672 Просмотров
Последний ответ Март 27, 2019, 22:40:21
от CreatoR