Книжка заметно прихорошилась - прямо как ёлочка перед новым годом Если можно, сейчас только несколько комментариев, конкретика потом
Quote (Alex_ST)
как изменить шаблон чтобы кроме Иванов не прихватывался ещё и Ливанов ?
По-моему, в чистом виде это невозможно (в VBScript не работает просмотр назад, а кириллица не позволяет использовать границы слова). Если не сдаваться, можно усилить функции (ввести возможность работы с языком собственного производства - VBScript+, и обеспечить уже на уровне VBA поддержку просмотра назад и границ слов для кириллицы)
Quote (Alex_ST)
а пустые разделители Matches - не везде
Это мой хомут. (Функция не была рассчитана на работу с шаблонами без подвыражений, поэтому при их отсутствии она просто сбоит. Обязательно исправлю)
Лёш, а зачем волотильность? Иногда ее можно стерпеть (при работе с датами и т.д.), а вообще я держусь от нее как можно дальше. Из-за нее, клятой, редко использую такую замечательную функцию, как СМЕЩ(). А сколько крови она портит при решении уравнений с привлечением циклических ссылок! В нашем тестере ячейки замечательно пересчитываются при изменении всех влияющих ячеек.
Книжка заметно прихорошилась - прямо как ёлочка перед новым годом Если можно, сейчас только несколько комментариев, конкретика потом
Quote (Alex_ST)
как изменить шаблон чтобы кроме Иванов не прихватывался ещё и Ливанов ?
По-моему, в чистом виде это невозможно (в VBScript не работает просмотр назад, а кириллица не позволяет использовать границы слова). Если не сдаваться, можно усилить функции (ввести возможность работы с языком собственного производства - VBScript+, и обеспечить уже на уровне VBA поддержку просмотра назад и границ слов для кириллицы)
Quote (Alex_ST)
а пустые разделители Matches - не везде
Это мой хомут. (Функция не была рассчитана на работу с шаблонами без подвыражений, поэтому при их отсутствии она просто сбоит. Обязательно исправлю)
Лёш, а зачем волотильность? Иногда ее можно стерпеть (при работе с датами и т.д.), а вообще я держусь от нее как можно дальше. Из-за нее, клятой, редко использую такую замечательную функцию, как СМЕЩ(). А сколько крови она портит при решении уравнений с привлечением циклических ссылок! В нашем тестере ячейки замечательно пересчитываются при изменении всех влияющих ячеек.v__step
С уважением, Владимир
Сообщение отредактировал v__step - Пятница, 30.12.2011, 11:18
волотильность осталась как рудиментарный орган от тех времён, когда не было возможности оперативно ("гулькой") менять IgnoreCase …
Quote (v__step)
Функция не была рассчитана на работу с шаблонами без подвыражений, поэтому при их отсутствии она просто сбоит
Ну, я там частично поправил: поставил обработчик ошибок с корректным выходом из подпрограммы и имена переменных поменял, извини. Но логику программы не трогал. Я думаю, что можно попробовать элементы коллекций перекидывать во временные одномерные массивы, а потом строку собирать по Join. Тогда не будет лишних разделителей на первом и последнем элементах. И ещё идея: совместить бы fRegExMatches и fRegExSubMatches в одну функцию, возвращающую массив из двух элементов. Тогда обработка, наверное, сильно ускорилась бы. Вот только с функциями массива на листе я работать ну совсем не умею. И поэтому не знаю, как в одну ячейку вывести первый элемент функции, возвращающей массив, а в другую - второй.
Quote (v__step)
Лёш, а зачем волотильность?
волотильность осталась как рудиментарный орган от тех времён, когда не было возможности оперативно ("гулькой") менять IgnoreCase …
Quote (v__step)
Функция не была рассчитана на работу с шаблонами без подвыражений, поэтому при их отсутствии она просто сбоит
Ну, я там частично поправил: поставил обработчик ошибок с корректным выходом из подпрограммы и имена переменных поменял, извини. Но логику программы не трогал. Я думаю, что можно попробовать элементы коллекций перекидывать во временные одномерные массивы, а потом строку собирать по Join. Тогда не будет лишних разделителей на первом и последнем элементах. И ещё идея: совместить бы fRegExMatches и fRegExSubMatches в одну функцию, возвращающую массив из двух элементов. Тогда обработка, наверное, сильно ускорилась бы. Вот только с функциями массива на листе я работать ну совсем не умею. И поэтому не знаю, как в одну ячейку вывести первый элемент функции, возвращающей массив, а в другую - второй. Alex_ST
Лёш, привет! Постарался учесть твои пожелания - добавил функцию, работающую "за двоих", и возвращающую массив (при копировании по строкам ничего дополнительно делать не надо) Одолел пустые SubMatches В примечаниях VBA заменил "подвыражения" на "подвхождения" (было совсем уже неправильно) Распространил твою стилистику (S as string >> S$) на функции, возвращающие SubMatches
Закомментировал Application.Volatile (книга все правильно поняла и перестала виснуть). Если хочешь, эту тему обсудим отдельно, но сейчас предлагаю перемирие (в основном, на твоих и на этом одном моём условии)
Дополнять VBScript до VBScript++ страшно не хочется (времени угрохаю много, а результат возможен VBScript--) Так что пока что Ливанов победил Иванова и меня заодно
Лёш, привет! Постарался учесть твои пожелания - добавил функцию, работающую "за двоих", и возвращающую массив (при копировании по строкам ничего дополнительно делать не надо) Одолел пустые SubMatches В примечаниях VBA заменил "подвыражения" на "подвхождения" (было совсем уже неправильно) Распространил твою стилистику (S as string >> S$) на функции, возвращающие SubMatches
Закомментировал Application.Volatile (книга все правильно поняла и перестала виснуть). Если хочешь, эту тему обсудим отдельно, но сейчас предлагаю перемирие (в основном, на твоих и на этом одном моём условии)
Дополнять VBScript до VBScript++ страшно не хочется (времени угрохаю много, а результат возможен VBScript--) Так что пока что Ливанов победил Иванова и меня заодно v__step
Распространил твою стилистику (S as string >> S$) на функции, возвращающие SubMatches
ну, это скорее из лени (писАть так короче) и из любви к более коротким выражениям. Те, кто давно программирует, это, естественно, понимают. А начинающим иногда бывает непривычно. Так что вообще-то если мы пытаемся сделать общепонятный справочник-помощник, то лучше бы в финальной версии заменить $ As String
Quote (v__step)
Закомментировал Application.Volatile
у меня просто почему-то иногда функции на листах обновляться "ленились" после перехода с листа в VBE и редактирования там чего-нибудь и обратно вместо значений выводилось #ИМЯ? вот я волотильность и добавил. Посмотреть твою новую работу в ближайшие дни не смогу - ко мне в гости до Рождества родня из Вологды и Череповца приехала. У нас культурная программа.
Да, и может быть лучше ты свои новые варианты будешь называть без суффикса plus, а просто по датам. Этим суффиксом лучше обозначать доработки конкретных вариантов.
Привет, Володя!
Quote (v__step)
Распространил твою стилистику (S as string >> S$) на функции, возвращающие SubMatches
ну, это скорее из лени (писАть так короче) и из любви к более коротким выражениям. Те, кто давно программирует, это, естественно, понимают. А начинающим иногда бывает непривычно. Так что вообще-то если мы пытаемся сделать общепонятный справочник-помощник, то лучше бы в финальной версии заменить $ As String
Quote (v__step)
Закомментировал Application.Volatile
у меня просто почему-то иногда функции на листах обновляться "ленились" после перехода с листа в VBE и редактирования там чего-нибудь и обратно вместо значений выводилось #ИМЯ? вот я волотильность и добавил. Посмотреть твою новую работу в ближайшие дни не смогу - ко мне в гости до Рождества родня из Вологды и Череповца приехала. У нас культурная программа.
Да, и может быть лучше ты свои новые варианты будешь называть без суффикса plus, а просто по датам. Этим суффиксом лучше обозначать доработки конкретных вариантов.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Воскресенье, 01.01.2012, 22:24
Вроде бы понятно, но ведь это не чистый RegExp! Собственно, если это и есть решение, которое работает, то все уже получилось, причем просто и ясно! Наверное, нечто похожее можно было бы проделать и в VB (получить коллекцию Matches по шаблону поиска, пробежаться по ней в цикле, разделить результаты на 3 группы по признаку - первому символу и затем что-то с этим всем делать) Но я стараюсь переложить на чистый RegExp максимум из того, что ему под силу. В VB такое решение почти всегда будет оптимальным
Quote (v__step)
Во всех диалектах RegExp
Это я резковато... о таких высказываниях потом всегда жалеешь До конца дня надо отлучиться
Вроде бы понятно, но ведь это не чистый RegExp! Собственно, если это и есть решение, которое работает, то все уже получилось, причем просто и ясно! Наверное, нечто похожее можно было бы проделать и в VB (получить коллекцию Matches по шаблону поиска, пробежаться по ней в цикле, разделить результаты на 3 группы по признаку - первому символу и затем что-то с этим всем делать) Но я стараюсь переложить на чистый RegExp максимум из того, что ему под силу. В VB такое решение почти всегда будет оптимальным
Quote (v__step)
Во всех диалектах RegExp
Это я резковато... о таких высказываниях потом всегда жалеешь До конца дня надо отлучитьсяv__step
С уважением, Владимир
Сообщение отредактировал v__step - Понедельник, 02.01.2012, 14:15
Это мы сделаем по-другому: в процедуру реакции на изменение галочки добавим только одну новую строчку: Application.Calculate
а ты код смотрел? И где там, интересно, на листах процедуры обработки событий изменения "гулек"? В том то и дело, что все эти гульки - не OLE-объекты CheckBox, а элементы управления форм Флажок. И все они просто в их свойствах "завязаны" на одну и ту же именованную ячейку bIgnoreCase на листе Метасимволы+. И, т.к. у таких элементов управления связь с ячейкой "дуплексная" , то, изменяя гульку на любом из листов, мы изменяем не только значение bIgnoreCase, но и значения всех других гулек, связанных с этой ячейкой. Поэтому на листах кода нет вообще! И добавлять на листы я такие гульки могу сколько угодно без написания кодов процедур обработки событий. Но вообще-то это абсолютно не принципиально. Просто для примеров сделать именно так мне показалось проще.
Володя, привет!
Quote (v__step)
Это мы сделаем по-другому: в процедуру реакции на изменение галочки добавим только одну новую строчку: Application.Calculate
а ты код смотрел? И где там, интересно, на листах процедуры обработки событий изменения "гулек"? В том то и дело, что все эти гульки - не OLE-объекты CheckBox, а элементы управления форм Флажок. И все они просто в их свойствах "завязаны" на одну и ту же именованную ячейку bIgnoreCase на листе Метасимволы+. И, т.к. у таких элементов управления связь с ячейкой "дуплексная" , то, изменяя гульку на любом из листов, мы изменяем не только значение bIgnoreCase, но и значения всех других гулек, связанных с этой ячейкой. Поэтому на листах кода нет вообще! И добавлять на листы я такие гульки могу сколько угодно без написания кодов процедур обработки событий. Но вообще-то это абсолютно не принципиально. Просто для примеров сделать именно так мне показалось проще.Alex_ST
Ты меня видишь насквозь Лёш, я обещаю, выкрутимся без волотильности! Всем галочкам можно назначить общий, достаточно простой макрос, который для каждой ячейки с формулой перезапишет значение первой из влияющих ячеек - все обновится, увидишь
Лёш, привет!
Quote (Alex_ST)
а ты код смотрел?
Ты меня видишь насквозь Лёш, я обещаю, выкрутимся без волотильности! Всем галочкам можно назначить общий, достаточно простой макрос, который для каждой ячейки с формулой перезапишет значение первой из влияющих ячеек - все обновится, увидишьv__step
С уважением, Владимир
Сообщение отредактировал v__step - Вторник, 03.01.2012, 10:01
Да далась тебе эта волотильность! Оставь её в покое хотя бы в этой книге примеров для незасорения её избыточными процедурами, не относящимися к теме книги и решающими не принципиальные вопросы. То тебе позднее связывание как серпом по молоту, то волотильность... Ну не влияют они на суть вопроса!
Да далась тебе эта волотильность! Оставь её в покое хотя бы в этой книге примеров для незасорения её избыточными процедурами, не относящимися к теме книги и решающими не принципиальные вопросы. То тебе позднее связывание как серпом по молоту, то волотильность... Ну не влияют они на суть вопроса!Alex_ST
Кажется, получилось: по твоему предложению одна функция обрабатывает вхождения и подвхождения, причем она знает, применяют ее как обычную формулу (тогда она не делает лишние действия и возвращает обычную строку) или как формулу массива Сейчас она применена на всех листах для обработки вхождений и подвхождений
Столбец с подвхождениями на листе Метасимволы+ скрыл, т.к. это материал более сложный, и во всех книгах он изложен отдельно и позже, иначе в беззащитной голове доверчивого читателя возникает каша. Мне кажется, его стоит удалить (кому надо, сам добавит) На листе SubMatches задействованы формулы массива
Кажется, получилось: по твоему предложению одна функция обрабатывает вхождения и подвхождения, причем она знает, применяют ее как обычную формулу (тогда она не делает лишние действия и возвращает обычную строку) или как формулу массива Сейчас она применена на всех листах для обработки вхождений и подвхождений
Столбец с подвхождениями на листе Метасимволы+ скрыл, т.к. это материал более сложный, и во всех книгах он изложен отдельно и позже, иначе в беззащитной голове доверчивого читателя возникает каша. Мне кажется, его стоит удалить (кому надо, сам добавит) На листе SubMatches задействованы формулы массиваv__step
Володя, всё-таки я выкроил немного времени, чуть потестировал и понял, что волотильность была нужна! Пока ты её не заремарил, изменение на листе гульки IgnoreCase сразу вызывало пересчёт и показывался результат. А у тебя нужно в ячейку с функцией кликнуть мышкой. Так что в примерах и тестере волотильность лучше оставить.
Володя, всё-таки я выкроил немного времени, чуть потестировал и понял, что волотильность была нужна! Пока ты её не заремарил, изменение на листе гульки IgnoreCase сразу вызывало пересчёт и показывался результат. А у тебя нужно в ячейку с функцией кликнуть мышкой. Так что в примерах и тестере волотильность лучше оставить.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Воскресенье, 01.01.2012, 22:06
Привет, Володя! Я сейчас занят: родню по Москве гуляю... Но файл твой таки-посмотрел. ИМХО,
Quote (v__step)
Столбец с подвхождениями на листе Метасимволы+ скрыл
это ты сделал зря. Т.к. этот лист - справочник в т.ч. и для тех, кто уже имеет представление о том, что существуют SubMatches. Поэтому столбец прятать не надо. Там всё очень наглядно. И видно, когда SubMatches создаются, а когда - нет. Например, SubMatches создаются при выборе "ИЛИ", а не только при шаблоне с круглыми скобками. И УФ там тоже к месту.
Привет, Володя! Я сейчас занят: родню по Москве гуляю... Но файл твой таки-посмотрел. ИМХО,
Quote (v__step)
Столбец с подвхождениями на листе Метасимволы+ скрыл
это ты сделал зря. Т.к. этот лист - справочник в т.ч. и для тех, кто уже имеет представление о том, что существуют SubMatches. Поэтому столбец прятать не надо. Там всё очень наглядно. И видно, когда SubMatches создаются, а когда - нет. Например, SubMatches создаются при выборе "ИЛИ", а не только при шаблоне с круглыми скобками. И УФ там тоже к месту.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 04.01.2012, 14:22
Не только раскрыть надо, но и формулы для SubMatches там в начальных строках восстановить... Где-то кто-то их когда-то затёр в процессе доработок.
Не только раскрыть надо, но и формулы для SubMatches там в начальных строках восстановить... Где-то кто-то их когда-то затёр в процессе доработок.Alex_ST
Задача №1 (с планеты). Выделить из текста номера артикулов и их количество. Артикул - это шесть цифр, перед кот. стоит дефис, а перед дефисом еще три лат. буквы. Количество, эм... ну впримере дино) [vba]
Code
' Пример данных: ' артикул: POD-000223:1 шт.=1.80грн ' артикулPOD-000234- 1шт ' артикул: POD-000218надо1 шт. ' нужноPOD-000221-1уп.2.50грн ' артикул-ZEP-000422 -1 метр.
' Решение - UDF. 1-ый аргумент срока, второй шаблон: 0 - артикул, 1 - количество. (пример в файле прилагается) Public Function io(ByRef x As String, ByRef z As Byte) As String With CreateObject("VBScript.RegExp") .Pattern = IIf(z, "\d+\W+(?:\.|$)", ".{4}\d{6}") io = .Execute(x)(0).Value End With End Function
[/vba]
Задача №2. Есть строка, в кот. записано целое число. Разделить группы разрядов числа, для удобства чтения/восприятия. [vba]
Code
' Решение Sub io() Dim x As String x = "1234567890" ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(?!^)(?=(?:\d{3})+$)" x = .Replace(x, " ") End With MsgBox x End Sub
[/vba] Надеюсь, хотя бы один из них Вам покажется интересным
p.s.: есть у Вас какие нибудь интересные/неразрешимые задачи для regexp?
Всем привет) Решил подкинуть пару примеров.
Задача №1 (с планеты). Выделить из текста номера артикулов и их количество. Артикул - это шесть цифр, перед кот. стоит дефис, а перед дефисом еще три лат. буквы. Количество, эм... ну впримере дино) [vba]
Code
' Пример данных: ' артикул: POD-000223:1 шт.=1.80грн ' артикулPOD-000234- 1шт ' артикул: POD-000218надо1 шт. ' нужноPOD-000221-1уп.2.50грн ' артикул-ZEP-000422 -1 метр.
' Решение - UDF. 1-ый аргумент срока, второй шаблон: 0 - артикул, 1 - количество. (пример в файле прилагается) Public Function io(ByRef x As String, ByRef z As Byte) As String With CreateObject("VBScript.RegExp") .Pattern = IIf(z, "\d+\W+(?:\.|$)", ".{4}\d{6}") io = .Execute(x)(0).Value End With End Function
[/vba]
Задача №2. Есть строка, в кот. записано целое число. Разделить группы разрядов числа, для удобства чтения/восприятия. [vba]
Code
' Решение Sub io() Dim x As String x = "1234567890" ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(?!^)(?=(?:\d{3})+$)" x = .Replace(x, " ") End With MsgBox x End Sub
[/vba] Надеюсь, хотя бы один из них Вам покажется интересным
p.s.: есть у Вас какие нибудь интересные/неразрешимые задачи для regexp?nerv
Надеюсь, хотя бы один из них Вам покажется интересным
Конечно, интересно и красиво! Можно чуть-чуть критики? По-моему, в VBScript5.5 (?:...) не поддерживается - если убрать, ничего не изменится
Quote (nerv)
есть у Вас какие нибудь интересные/неразрешимые задачи для regexp?
Лёша, прости меня за флуд, но сдержаться нет никаких сил (в день рождения Сереги нам простят). Я буду предельно краток Красивая задача для RegExp давно живет рядом с Вами. Это, например, алгоритм нечеткого поиска, основаный на подсчете совпадений подстрок (если не ошибаюсь, его предложил Формуляр). Надо найти количество совпадений (посимвольных, по-два, по-три и т.д.) подстрок из строки А в строке Б. Для этого можно: 1) с помощью RegExp.Replace сгенерировать строку-шаблон (напр., "х|о|р|о|ш|о" или "хо|ро|шо" или "хор|ошо" и т.д.) 2) применить этот шаблон для подсчета вхождений (RegExp.Matches.Count) 3) прокрутить в цикле для обрезанных слева (а иногда и справа) строк (для смещения зоны поиска на 1 символ и учета кратности длины строки числу 2; 3 и т.д.) 4) выяснить, что как всегда, не все так просто, и решение не идеально. Добавить предварительную очистку строк от пробелов, знаков препинания и т.д. (естественно, с помощью RegExp). Понять, что решение все равно не совершенно Почти наверняка найдется и другая работа для RegExp в благородном деле нечеткого поиска
Quote (nerv)
Надеюсь, хотя бы один из них Вам покажется интересным
Конечно, интересно и красиво! Можно чуть-чуть критики? По-моему, в VBScript5.5 (?:...) не поддерживается - если убрать, ничего не изменится
Quote (nerv)
есть у Вас какие нибудь интересные/неразрешимые задачи для regexp?
Лёша, прости меня за флуд, но сдержаться нет никаких сил (в день рождения Сереги нам простят). Я буду предельно краток Красивая задача для RegExp давно живет рядом с Вами. Это, например, алгоритм нечеткого поиска, основаный на подсчете совпадений подстрок (если не ошибаюсь, его предложил Формуляр). Надо найти количество совпадений (посимвольных, по-два, по-три и т.д.) подстрок из строки А в строке Б. Для этого можно: 1) с помощью RegExp.Replace сгенерировать строку-шаблон (напр., "х|о|р|о|ш|о" или "хо|ро|шо" или "хор|ошо" и т.д.) 2) применить этот шаблон для подсчета вхождений (RegExp.Matches.Count) 3) прокрутить в цикле для обрезанных слева (а иногда и справа) строк (для смещения зоны поиска на 1 символ и учета кратности длины строки числу 2; 3 и т.д.) 4) выяснить, что как всегда, не все так просто, и решение не идеально. Добавить предварительную очистку строк от пробелов, знаков препинания и т.д. (естественно, с помощью RegExp). Понять, что решение все равно не совершенно Почти наверняка найдется и другая работа для RegExp в благородном деле нечеткого поискаv__step
С уважением, Владимир
Сообщение отредактировал v__step - Понедельник, 09.01.2012, 13:58
Измениться. Скобки станут запоминающими, а это не желательно. Во втором случае, это (?:\d{3}) можно заменить на это \d\d\d.
Говорят "Matches" - это медленно. Не знаю, как в VBA работает exec[ute], но в js рекомендуют использовать именно его. Насчет нечеткого поиска, мне мысль тож сегодня в голову с утра пришла) Правда, я сомневаюсь в том, что регулярные выражения сделают это быстрее, чем функции для работы со строками.
Quote (v__step)
если убрать, ничего не изменится
Измениться. Скобки станут запоминающими, а это не желательно. Во втором случае, это (?:\d{3}) можно заменить на это \d\d\d.
Говорят "Matches" - это медленно. Не знаю, как в VBA работает exec[ute], но в js рекомендуют использовать именно его. Насчет нечеткого поиска, мне мысль тож сегодня в голову с утра пришла) Правда, я сомневаюсь в том, что регулярные выражения сделают это быстрее, чем функции для работы со строками.nerv
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук