Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поговорим про RegExp? - Страница 9 - Мир MS Excel

Старая форма входа
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Поговорим про RegExp? (Подготовка для топика FAQ по RegExp в Готовых решениях)
Поговорим про RegExp?
v__step Дата: Пятница, 30.12.2011, 11:16 | Сообщение № 161
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Книжка заметно прихорошилась - прямо как ёлочка перед новым годом biggrin
Если можно, сейчас только несколько комментариев, конкретика потом
Quote (Alex_ST)
как изменить шаблон чтобы кроме Иванов не прихватывался ещё и Ливанов ?
По-моему, в чистом виде это невозможно (в VBScript не работает просмотр назад, а кириллица не позволяет использовать границы слова). Если не сдаваться, можно усилить функции (ввести возможность работы с языком собственного производства - VBScript+, и обеспечить уже на уровне VBA поддержку просмотра назад и границ слов для кириллицы)
Quote (Alex_ST)
а пустые разделители Matches - не везде
Это мой хомут. (Функция не была рассчитана на работу с шаблонами без подвыражений, поэтому при их отсутствии она просто сбоит. Обязательно исправлю)

Лёш, а зачем волотильность? Иногда ее можно стерпеть (при работе с датами и т.д.), а вообще я держусь от нее как можно дальше. Из-за нее, клятой, редко использую такую замечательную функцию, как СМЕЩ(). А сколько крови она портит при решении уравнений с привлечением циклических ссылок!
В нашем тестере ячейки замечательно пересчитываются при изменении всех влияющих ячеек.


С уважением, Владимир

Сообщение отредактировал v__step - Пятница, 30.12.2011, 11:18
 
Ответить
СообщениеКнижка заметно прихорошилась - прямо как ёлочка перед новым годом biggrin
Если можно, сейчас только несколько комментариев, конкретика потом
Quote (Alex_ST)
как изменить шаблон чтобы кроме Иванов не прихватывался ещё и Ливанов ?
По-моему, в чистом виде это невозможно (в VBScript не работает просмотр назад, а кириллица не позволяет использовать границы слова). Если не сдаваться, можно усилить функции (ввести возможность работы с языком собственного производства - VBScript+, и обеспечить уже на уровне VBA поддержку просмотра назад и границ слов для кириллицы)
Quote (Alex_ST)
а пустые разделители Matches - не везде
Это мой хомут. (Функция не была рассчитана на работу с шаблонами без подвыражений, поэтому при их отсутствии она просто сбоит. Обязательно исправлю)

Лёш, а зачем волотильность? Иногда ее можно стерпеть (при работе с датами и т.д.), а вообще я держусь от нее как можно дальше. Из-за нее, клятой, редко использую такую замечательную функцию, как СМЕЩ(). А сколько крови она портит при решении уравнений с привлечением циклических ссылок!
В нашем тестере ячейки замечательно пересчитываются при изменении всех влияющих ячеек.

Автор - v__step
Дата добавления - 30.12.2011 в 11:16
Alex_ST Дата: Пятница, 30.12.2011, 13:21 | Сообщение № 162
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (v__step)
Лёш, а зачем волотильность?
волотильность осталась как рудиментарный орган от тех времён, когда не было возможности оперативно ("гулькой") менять IgnoreCase …

Quote (v__step)
Функция не была рассчитана на работу с шаблонами без подвыражений, поэтому при их отсутствии она просто сбоит

Ну, я там частично поправил: поставил обработчик ошибок с корректным выходом из подпрограммы и имена переменных поменял, извини. Но логику программы не трогал.
Я думаю, что можно попробовать элементы коллекций перекидывать во временные одномерные массивы, а потом строку собирать по Join. Тогда не будет лишних разделителей на первом и последнем элементах.
И ещё идея: совместить бы fRegExMatches и fRegExSubMatches в одну функцию, возвращающую массив из двух элементов. Тогда обработка, наверное, сильно ускорилась бы. Вот только с функциями массива на листе я работать ну совсем не умею. И поэтому не знаю, как в одну ячейку вывести первый элемент функции, возвращающей массив, а в другую - второй. sad



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (v__step)
Лёш, а зачем волотильность?
волотильность осталась как рудиментарный орган от тех времён, когда не было возможности оперативно ("гулькой") менять IgnoreCase …

Quote (v__step)
Функция не была рассчитана на работу с шаблонами без подвыражений, поэтому при их отсутствии она просто сбоит

Ну, я там частично поправил: поставил обработчик ошибок с корректным выходом из подпрограммы и имена переменных поменял, извини. Но логику программы не трогал.
Я думаю, что можно попробовать элементы коллекций перекидывать во временные одномерные массивы, а потом строку собирать по Join. Тогда не будет лишних разделителей на первом и последнем элементах.
И ещё идея: совместить бы fRegExMatches и fRegExSubMatches в одну функцию, возвращающую массив из двух элементов. Тогда обработка, наверное, сильно ускорилась бы. Вот только с функциями массива на листе я работать ну совсем не умею. И поэтому не знаю, как в одну ячейку вывести первый элемент функции, возвращающей массив, а в другую - второй. sad

Автор - Alex_ST
Дата добавления - 30.12.2011 в 13:21
v__step Дата: Воскресенье, 01.01.2012, 21:20 | Сообщение № 163
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Лёш, привет!
Постарался учесть твои пожелания - добавил функцию, работающую "за двоих", и возвращающую массив (при копировании по строкам ничего дополнительно делать не надо)
Одолел пустые SubMatches
В примечаниях VBA заменил "подвыражения" на "подвхождения" (было совсем уже неправильно)
Распространил твою стилистику (S as string >> S$) на функции, возвращающие SubMatches

Закомментировал Application.Volatile (книга все правильно поняла и перестала виснуть). Если хочешь, эту тему обсудим отдельно, но сейчас предлагаю перемирие (в основном, на твоих и на этом одном моём условии) smile

Дополнять VBScript до VBScript++ страшно не хочется (времени угрохаю много, а результат возможен VBScript--)
Так что пока что Ливанов победил Иванова и меня заодно biggrin
К сообщению приложен файл: RegExp01_01_12p.rar (84.2 Kb)


С уважением, Владимир

Сообщение отредактировал v__step - Воскресенье, 01.01.2012, 21:20
 
Ответить
СообщениеЛёш, привет!
Постарался учесть твои пожелания - добавил функцию, работающую "за двоих", и возвращающую массив (при копировании по строкам ничего дополнительно делать не надо)
Одолел пустые SubMatches
В примечаниях VBA заменил "подвыражения" на "подвхождения" (было совсем уже неправильно)
Распространил твою стилистику (S as string >> S$) на функции, возвращающие SubMatches

Закомментировал Application.Volatile (книга все правильно поняла и перестала виснуть). Если хочешь, эту тему обсудим отдельно, но сейчас предлагаю перемирие (в основном, на твоих и на этом одном моём условии) smile

Дополнять VBScript до VBScript++ страшно не хочется (времени угрохаю много, а результат возможен VBScript--)
Так что пока что Ливанов победил Иванова и меня заодно biggrin

Автор - v__step
Дата добавления - 01.01.2012 в 21:20
Alex_ST Дата: Воскресенье, 01.01.2012, 21:45 | Сообщение № 164
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Привет, Володя!
Quote (v__step)
Распространил твою стилистику (S as string >> S$) на функции, возвращающие SubMatches
ну, это скорее из лени (писАть так короче) и из любви к более коротким выражениям. Те, кто давно программирует, это, естественно, понимают. А начинающим иногда бывает непривычно. Так что вообще-то если мы пытаемся сделать общепонятный справочник-помощник, то лучше бы в финальной версии заменить $ As String
Quote (v__step)
Закомментировал Application.Volatile
у меня просто почему-то иногда функции на листах обновляться "ленились" после перехода с листа в VBE и редактирования там чего-нибудь и обратно вместо значений выводилось #ИМЯ? вот я волотильность и добавил.
Посмотреть твою новую работу в ближайшие дни не смогу - ко мне в гости до Рождества родня из Вологды и Череповца приехала. У нас культурная программа.

Да, и может быть лучше ты свои новые варианты будешь называть без суффикса plus, а просто по датам. Этим суффиксом лучше обозначать доработки конкретных вариантов.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Воскресенье, 01.01.2012, 22:24
 
Ответить
СообщениеПривет, Володя!
Quote (v__step)
Распространил твою стилистику (S as string >> S$) на функции, возвращающие SubMatches
ну, это скорее из лени (писАть так короче) и из любви к более коротким выражениям. Те, кто давно программирует, это, естественно, понимают. А начинающим иногда бывает непривычно. Так что вообще-то если мы пытаемся сделать общепонятный справочник-помощник, то лучше бы в финальной версии заменить $ As String
Quote (v__step)
Закомментировал Application.Volatile
у меня просто почему-то иногда функции на листах обновляться "ленились" после перехода с листа в VBE и редактирования там чего-нибудь и обратно вместо значений выводилось #ИМЯ? вот я волотильность и добавил.
Посмотреть твою новую работу в ближайшие дни не смогу - ко мне в гости до Рождества родня из Вологды и Череповца приехала. У нас культурная программа.

Да, и может быть лучше ты свои новые варианты будешь называть без суффикса plus, а просто по датам. Этим суффиксом лучше обозначать доработки конкретных вариантов.

Автор - Alex_ST
Дата добавления - 01.01.2012 в 21:45
v__step Дата: Понедельник, 02.01.2012, 13:44 | Сообщение № 165
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Вроде бы понятно, но ведь это не чистый RegExp!
Собственно, если это и есть решение, которое работает, то все уже получилось, причем просто и ясно!
Наверное, нечто похожее можно было бы проделать и в VB (получить коллекцию Matches по шаблону поиска, пробежаться по ней в цикле, разделить результаты на 3 группы по признаку - первому символу и затем что-то с этим всем делать)
Но я стараюсь переложить на чистый RegExp максимум из того, что ему под силу. В VB такое решение почти всегда будет оптимальным
Quote (v__step)
Во всех диалектах RegExp
Это я резковато... о таких высказываниях потом всегда жалеешь
До конца дня надо отлучиться


С уважением, Владимир

Сообщение отредактировал v__step - Понедельник, 02.01.2012, 14:15
 
Ответить
СообщениеВроде бы понятно, но ведь это не чистый RegExp!
Собственно, если это и есть решение, которое работает, то все уже получилось, причем просто и ясно!
Наверное, нечто похожее можно было бы проделать и в VB (получить коллекцию Matches по шаблону поиска, пробежаться по ней в цикле, разделить результаты на 3 группы по признаку - первому символу и затем что-то с этим всем делать)
Но я стараюсь переложить на чистый RegExp максимум из того, что ему под силу. В VB такое решение почти всегда будет оптимальным
Quote (v__step)
Во всех диалектах RegExp
Это я резковато... о таких высказываниях потом всегда жалеешь
До конца дня надо отлучиться

Автор - v__step
Дата добавления - 02.01.2012 в 13:44
Alex_ST Дата: Понедельник, 02.01.2012, 22:32 | Сообщение № 166
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Володя, привет!
Quote (v__step)
Это мы сделаем по-другому: в процедуру реакции на изменение галочки добавим только одну новую строчку: Application.Calculate
а ты код смотрел? И где там, интересно, на листах процедуры обработки событий изменения "гулек"?
В том то и дело, что все эти гульки - не OLE-объекты CheckBox, а элементы управления форм Флажок. И все они просто в их свойствах "завязаны" на одну и ту же именованную ячейку bIgnoreCase на листе Метасимволы+. И, т.к. у таких элементов управления связь с ячейкой "дуплексная" smile , то, изменяя гульку на любом из листов, мы изменяем не только значение bIgnoreCase, но и значения всех других гулек, связанных с этой ячейкой.
Поэтому на листах кода нет вообще! И добавлять на листы я такие гульки могу сколько угодно без написания кодов процедур обработки событий.
Но вообще-то это абсолютно не принципиально. Просто для примеров сделать именно так мне показалось проще.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеВолодя, привет!
Quote (v__step)
Это мы сделаем по-другому: в процедуру реакции на изменение галочки добавим только одну новую строчку: Application.Calculate
а ты код смотрел? И где там, интересно, на листах процедуры обработки событий изменения "гулек"?
В том то и дело, что все эти гульки - не OLE-объекты CheckBox, а элементы управления форм Флажок. И все они просто в их свойствах "завязаны" на одну и ту же именованную ячейку bIgnoreCase на листе Метасимволы+. И, т.к. у таких элементов управления связь с ячейкой "дуплексная" smile , то, изменяя гульку на любом из листов, мы изменяем не только значение bIgnoreCase, но и значения всех других гулек, связанных с этой ячейкой.
Поэтому на листах кода нет вообще! И добавлять на листы я такие гульки могу сколько угодно без написания кодов процедур обработки событий.
Но вообще-то это абсолютно не принципиально. Просто для примеров сделать именно так мне показалось проще.

Автор - Alex_ST
Дата добавления - 02.01.2012 в 22:32
v__step Дата: Понедельник, 02.01.2012, 23:04 | Сообщение № 167
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Лёш, привет!
Quote (Alex_ST)
а ты код смотрел?
Ты меня видишь насквозь
Лёш, я обещаю, выкрутимся без волотильности!
Всем галочкам можно назначить общий, достаточно простой макрос, который для каждой ячейки с формулой перезапишет значение первой из влияющих ячеек - все обновится, увидишь


С уважением, Владимир

Сообщение отредактировал v__step - Вторник, 03.01.2012, 10:01
 
Ответить
СообщениеЛёш, привет!
Quote (Alex_ST)
а ты код смотрел?
Ты меня видишь насквозь
Лёш, я обещаю, выкрутимся без волотильности!
Всем галочкам можно назначить общий, достаточно простой макрос, который для каждой ячейки с формулой перезапишет значение первой из влияющих ячеек - все обновится, увидишь

Автор - v__step
Дата добавления - 02.01.2012 в 23:04
Alex_ST Дата: Вторник, 03.01.2012, 19:33 | Сообщение № 168
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

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



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеДа далась тебе эта волотильность! Оставь её в покое хотя бы в этой книге примеров для незасорения её избыточными процедурами, не относящимися к теме книги и решающими не принципиальные вопросы.
То тебе позднее связывание как серпом по молоту, то волотильность...
Ну не влияют они на суть вопроса!

Автор - Alex_ST
Дата добавления - 03.01.2012 в 19:33
v__step Дата: Среда, 04.01.2012, 02:12 | Сообщение № 169
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Кажется, получилось: по твоему предложению одна функция обрабатывает вхождения и подвхождения, причем она знает, применяют ее как обычную формулу (тогда она не делает лишние действия и возвращает обычную строку) или как формулу массива
Сейчас она применена на всех листах для обработки вхождений и подвхождений

Столбец с подвхождениями на листе Метасимволы+ скрыл, т.к. это материал более сложный, и во всех книгах он изложен отдельно и позже, иначе в беззащитной голове доверчивого читателя возникает каша. Мне кажется, его стоит удалить (кому надо, сам добавит)
На листе SubMatches задействованы формулы массива
К сообщению приложен файл: _RegExp_03_01_1.zip (85.4 Kb)


С уважением, Владимир

Сообщение отредактировал v__step - Среда, 04.01.2012, 13:20
 
Ответить
СообщениеКажется, получилось: по твоему предложению одна функция обрабатывает вхождения и подвхождения, причем она знает, применяют ее как обычную формулу (тогда она не делает лишние действия и возвращает обычную строку) или как формулу массива
Сейчас она применена на всех листах для обработки вхождений и подвхождений

Столбец с подвхождениями на листе Метасимволы+ скрыл, т.к. это материал более сложный, и во всех книгах он изложен отдельно и позже, иначе в беззащитной голове доверчивого читателя возникает каша. Мне кажется, его стоит удалить (кому надо, сам добавит)
На листе SubMatches задействованы формулы массива

Автор - v__step
Дата добавления - 04.01.2012 в 02:12
Alex_ST Дата: Среда, 04.01.2012, 10:37 | Сообщение № 170
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Володя, всё-таки я выкроил немного времени, чуть потестировал и понял, что волотильность была нужна!
Пока ты её не заремарил, изменение на листе гульки IgnoreCase сразу вызывало пересчёт и показывался результат. А у тебя нужно в ячейку с функцией кликнуть мышкой.
Так что в примерах и тестере волотильность лучше оставить.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Воскресенье, 01.01.2012, 22:06
 
Ответить
СообщениеВолодя, всё-таки я выкроил немного времени, чуть потестировал и понял, что волотильность была нужна!
Пока ты её не заремарил, изменение на листе гульки IgnoreCase сразу вызывало пересчёт и показывался результат. А у тебя нужно в ячейку с функцией кликнуть мышкой.
Так что в примерах и тестере волотильность лучше оставить.

Автор - Alex_ST
Дата добавления - 04.01.2012 в 10:37
v__step Дата: Среда, 04.01.2012, 13:46 | Сообщение № 171
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Лёш, привет! Смотри последний файл - на галочки функции реагируют аж бегом smile


С уважением, Владимир

Сообщение отредактировал v__step - Среда, 04.01.2012, 13:48
 
Ответить
СообщениеЛёш, привет! Смотри последний файл - на галочки функции реагируют аж бегом smile

Автор - v__step
Дата добавления - 04.01.2012 в 13:46
Alex_ST Дата: Среда, 04.01.2012, 14:21 | Сообщение № 172
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Привет, Володя!
Я сейчас занят: родню по Москве гуляю... biggrin
Но файл твой таки-посмотрел.
ИМХО,
Quote (v__step)
Столбец с подвхождениями на листе Метасимволы+ скрыл
это ты сделал зря. Т.к. этот лист - справочник в т.ч. и для тех, кто уже имеет представление о том, что существуют SubMatches. Поэтому столбец прятать не надо. Там всё очень наглядно. И видно, когда SubMatches создаются, а когда - нет. Например, SubMatches создаются при выборе "ИЛИ", а не только при шаблоне с круглыми скобками. И УФ там тоже к месту.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Среда, 04.01.2012, 14:22
 
Ответить
СообщениеПривет, Володя!
Я сейчас занят: родню по Москве гуляю... biggrin
Но файл твой таки-посмотрел.
ИМХО,
Quote (v__step)
Столбец с подвхождениями на листе Метасимволы+ скрыл
это ты сделал зря. Т.к. этот лист - справочник в т.ч. и для тех, кто уже имеет представление о том, что существуют SubMatches. Поэтому столбец прятать не надо. Там всё очень наглядно. И видно, когда SubMatches создаются, а когда - нет. Например, SubMatches создаются при выборе "ИЛИ", а не только при шаблоне с круглыми скобками. И УФ там тоже к месту.

Автор - Alex_ST
Дата добавления - 04.01.2012 в 14:21
v__step Дата: Среда, 04.01.2012, 14:45 | Сообщение № 173
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Ладно, раскроем. Уж это точно не проблема biggrin


С уважением, Владимир
 
Ответить
СообщениеЛадно, раскроем. Уж это точно не проблема biggrin

Автор - v__step
Дата добавления - 04.01.2012 в 14:45
Alex_ST Дата: Среда, 04.01.2012, 14:50 | Сообщение № 174
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Не только раскрыть надо, но и формулы для SubMatches там в начальных строках восстановить... Где-то кто-то их когда-то затёр в процессе доработок.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеНе только раскрыть надо, но и формулы для SubMatches там в начальных строках восстановить... Где-то кто-то их когда-то затёр в процессе доработок.

Автор - Alex_ST
Дата добавления - 04.01.2012 в 14:50
v__step Дата: Среда, 04.01.2012, 16:19 | Сообщение № 175
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Все восстановим, все будет хорошо biggrin


С уважением, Владимир
 
Ответить
СообщениеВсе восстановим, все будет хорошо biggrin

Автор - v__step
Дата добавления - 04.01.2012 в 16:19
v__step Дата: Четверг, 05.01.2012, 23:27 | Сообщение № 176
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Прописал формулы массива везде, где только можно, раскрыл столбец с подвхождениями на листе Метасимволы+
Все будет хорошо smile
К сообщению приложен файл: _RegExp_05_01_1.zip (81.5 Kb)


С уважением, Владимир

Сообщение отредактировал v__step - Четверг, 05.01.2012, 23:28
 
Ответить
СообщениеПрописал формулы массива везде, где только можно, раскрыл столбец с подвхождениями на листе Метасимволы+
Все будет хорошо smile

Автор - v__step
Дата добавления - 05.01.2012 в 23:27
nerv Дата: Воскресенье, 08.01.2012, 23:36 | Сообщение № 177
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Всем привет) Решил подкинуть пару примеров.

Задача №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]
Надеюсь, хотя бы один из них Вам покажется интересным smile

p.s.: есть у Вас какие нибудь интересные/неразрешимые задачи для regexp?
К сообщению приложен файл: _post_295110.xls (23.5 Kb)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Понедельник, 09.01.2012, 01:03
 
Ответить
СообщениеВсем привет) Решил подкинуть пару примеров.

Задача №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]
Надеюсь, хотя бы один из них Вам покажется интересным smile

p.s.: есть у Вас какие нибудь интересные/неразрешимые задачи для regexp?

Автор - nerv
Дата добавления - 08.01.2012 в 23:36
v__step Дата: Понедельник, 09.01.2012, 11:43 | Сообщение № 178
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Quote (nerv)
Надеюсь, хотя бы один из них Вам покажется интересным
Конечно, интересно и красиво!
Можно чуть-чуть критики? По-моему, в VBScript5.5 (?:...) не поддерживается - если убрать, ничего не изменится
Quote (nerv)
есть у Вас какие нибудь интересные/неразрешимые задачи для regexp?
Лёша, прости меня за флуд, но сдержаться нет никаких сил (в день рождения Сереги нам простят). Я буду предельно краток
Красивая задача для RegExp давно живет рядом с Вами. Это, например, алгоритм нечеткого поиска, основаный на подсчете совпадений подстрок (если не ошибаюсь, его предложил Формуляр). Надо найти количество совпадений (посимвольных, по-два, по-три и т.д.) подстрок из строки А в строке Б. Для этого можно:
1) с помощью RegExp.Replace сгенерировать строку-шаблон (напр., "х|о|р|о|ш|о" или "хо|ро|шо" или "хор|ошо" и т.д.)
2) применить этот шаблон для подсчета вхождений (RegExp.Matches.Count)
3) прокрутить в цикле для обрезанных слева (а иногда и справа) строк (для смещения зоны поиска на 1 символ и учета кратности длины строки числу 2; 3 и т.д.)
4) выяснить, что как всегда, не все так просто, и решение не идеально. Добавить предварительную очистку строк от пробелов, знаков препинания и т.д. (естественно, с помощью RegExp). Понять, что решение все равно не совершенно
Почти наверняка найдется и другая работа для RegExp в благородном деле нечеткого поиска


С уважением, Владимир

Сообщение отредактировал v__step - Понедельник, 09.01.2012, 13:58
 
Ответить
Сообщение
Quote (nerv)
Надеюсь, хотя бы один из них Вам покажется интересным
Конечно, интересно и красиво!
Можно чуть-чуть критики? По-моему, в VBScript5.5 (?:...) не поддерживается - если убрать, ничего не изменится
Quote (nerv)
есть у Вас какие нибудь интересные/неразрешимые задачи для regexp?
Лёша, прости меня за флуд, но сдержаться нет никаких сил (в день рождения Сереги нам простят). Я буду предельно краток
Красивая задача для RegExp давно живет рядом с Вами. Это, например, алгоритм нечеткого поиска, основаный на подсчете совпадений подстрок (если не ошибаюсь, его предложил Формуляр). Надо найти количество совпадений (посимвольных, по-два, по-три и т.д.) подстрок из строки А в строке Б. Для этого можно:
1) с помощью RegExp.Replace сгенерировать строку-шаблон (напр., "х|о|р|о|ш|о" или "хо|ро|шо" или "хор|ошо" и т.д.)
2) применить этот шаблон для подсчета вхождений (RegExp.Matches.Count)
3) прокрутить в цикле для обрезанных слева (а иногда и справа) строк (для смещения зоны поиска на 1 символ и учета кратности длины строки числу 2; 3 и т.д.)
4) выяснить, что как всегда, не все так просто, и решение не идеально. Добавить предварительную очистку строк от пробелов, знаков препинания и т.д. (естественно, с помощью RegExp). Понять, что решение все равно не совершенно
Почти наверняка найдется и другая работа для RegExp в благородном деле нечеткого поиска

Автор - v__step
Дата добавления - 09.01.2012 в 11:43
nerv Дата: Понедельник, 09.01.2012, 12:00 | Сообщение № 179
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Quote (v__step)
если убрать, ничего не изменится

Измениться. Скобки станут запоминающими, а это не желательно. Во втором случае, это (?:\d{3}) можно заменить на это \d\d\d.

Говорят "Matches" - это медленно. Не знаю, как в VBA работает exec[ute], но в js рекомендуют использовать именно его. Насчет нечеткого поиска, мне мысль тож сегодня в голову с утра пришла) Правда, я сомневаюсь в том, что регулярные выражения сделают это быстрее, чем функции для работы со строками.


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Понедельник, 09.01.2012, 12:01
 
Ответить
Сообщение
Quote (v__step)
если убрать, ничего не изменится

Измениться. Скобки станут запоминающими, а это не желательно. Во втором случае, это (?:\d{3}) можно заменить на это \d\d\d.

Говорят "Matches" - это медленно. Не знаю, как в VBA работает exec[ute], но в js рекомендуют использовать именно его. Насчет нечеткого поиска, мне мысль тож сегодня в голову с утра пришла) Правда, я сомневаюсь в том, что регулярные выражения сделают это быстрее, чем функции для работы со строками.

Автор - nerv
Дата добавления - 09.01.2012 в 12:00
nerv Дата: Понедельник, 09.01.2012, 12:07 | Сообщение № 180
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Quote (v__step)
Ну, точно не тестировалось (не записан шаблон замены)

Не понял? Вы проверьте в компиляторе) Если возникнут вопросы, я отвечу smile


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение
Quote (v__step)
Ну, точно не тестировалось (не записан шаблон замены)

Не понял? Вы проверьте в компиляторе) Если возникнут вопросы, я отвечу smile

Автор - nerv
Дата добавления - 09.01.2012 в 12:07
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Поговорим про RegExp? (Подготовка для топика FAQ по RegExp в Готовых решениях)
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!