Не проходит, я уже пробовал: либо пробел после слова прихватывается (а он есть не всегда, может быть и всякая пунктуация), либо (если после * не ставить пробел), то и Иванович прихватывается
Quote (v__step)
Иванов[а|ы|ым|у]*
Не проходит, я уже пробовал: либо пробел после слова прихватывается (а он есть не всегда, может быть и всякая пунктуация), либо (если после * не ставить пробел), то и Иванович прихватываетсяAlex_ST
Написал было, но заметил опечатку уже у себя. Повторно:"Иванов(а|ы|ым|у)*". Список в скобках не полный. Еще 1 пример: "Принц и принцесса". Шаблон: "принц(есса)*" В обоих случаях "+" не сработает - только "*"
Quote (Alex_ST)
Иванов[а|ы|ым|у]
Написал было, но заметил опечатку уже у себя. Повторно:"Иванов(а|ы|ым|у)*". Список в скобках не полный. Еще 1 пример: "Принц и принцесса". Шаблон: "принц(есса)*" В обоих случаях "+" не сработает - только "*"v__step
Я смотрю, Володя, мы с тобой наперегонки удаляем свои поспешные посты Список в скобках пополнить не проблема. Главное, как не прихватить лишнего, того, что не входит в список? Ведь метасимвол "конец слова" с кириллицей не пашет
Я смотрю, Володя, мы с тобой наперегонки удаляем свои поспешные посты Список в скобках пополнить не проблема. Главное, как не прихватить лишнего, того, что не входит в список? Ведь метасимвол "конец слова" с кириллицей не пашет Alex_ST
А ты сейчас и не поднимал вопрос о конце света слова Вопрос с разделителями слов не простой, но, скорее всего, не безнадежный Если ты об этом, давай, на вечер Вообще, лучше проблему конкретизировать (решение зависит от тех самых мелочей в коих сокрыт...)
А ты сейчас и не поднимал вопрос о конце света слова Вопрос с разделителями слов не простой, но, скорее всего, не безнадежный Если ты об этом, давай, на вечер Вообще, лучше проблему конкретизировать (решение зависит от тех самых мелочей в коих сокрыт...)v__step
С уважением, Владимир
Сообщение отредактировал v__step - Четверг, 22.12.2011, 13:19
Вопрос чисто академически-познавательный: Есть "корень" (условно, конечно) слова и ограниченный набор его окончаний. Необходимо выделить из текста слова, состоящие из корня с любым из заданных окончаний и не прихватить при этом те слова, что имеют тот же корень, но их окончание не входит в список? Задача, как я понимаю, усложняется тем, что метасимволы "конец слова" с кириллицей не работают.
Вопрос чисто академически-познавательный: Есть "корень" (условно, конечно) слова и ограниченный набор его окончаний. Необходимо выделить из текста слова, состоящие из корня с любым из заданных окончаний и не прихватить при этом те слова, что имеют тот же корень, но их окончание не входит в список? Задача, как я понимаю, усложняется тем, что метасимволы "конец слова" с кириллицей не работают.Alex_ST
Задача, как я понимаю, усложняется тем, что метасимволы "конец слова" с кириллицей не работают.
А зачем искать конец слова? Проверь, шаблон поста 142 работает для текста любой сложности с произвольным количеством каких угодно разделителей Проблема в программном составлении конкретного шаблона. Это отдельный вопрос. Нужна постановка задачи
Quote (Alex_ST)
Задача, как я понимаю, усложняется тем, что метасимволы "конец слова" с кириллицей не работают.
А зачем искать конец слова? Проверь, шаблон поста 142 работает для текста любой сложности с произвольным количеством каких угодно разделителей Проблема в программном составлении конкретного шаблона. Это отдельный вопрос. Нужна постановка задачиv__step
С уважением, Владимир
Сообщение отредактировал v__step - Четверг, 22.12.2011, 14:34
Кто-то кого-то не понимает... Есть строка. Например: Иванов Иванова Ивановы Иванович Ты предлагаешь паттерн: Иванов(а|ы|ым|у)* RegExp возвращает: Иванов║Иванова║Ивановы║Иванов Т.е. произошёл "захват Ивановича" : Иванов Иванова Ивановы Иванович (ну, прямо как в Палестине )
Если же применить паттерн на Иванов(а|ы|ым|у) то RegExp возвращает: Иванова║Ивановы Т.е. "мы потеряли Иванова" : Иванов Иванова Ивановы Иванович
Quote (v__step)
Повторно:"Иванов(а|ы|ым|у)*"
Кто-то кого-то не понимает... Есть строка. Например: Иванов Иванова Ивановы Иванович Ты предлагаешь паттерн: Иванов(а|ы|ым|у)* RegExp возвращает: Иванов║Иванова║Ивановы║Иванов Т.е. произошёл "захват Ивановича" : Иванов Иванова Ивановы Иванович (ну, прямо как в Палестине )
Если же применить паттерн на Иванов(а|ы|ым|у) то RegExp возвращает: Иванова║Ивановы Т.е. "мы потеряли Иванова" : Иванов Иванова Ивановы ИвановичAlex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Четверг, 22.12.2011, 14:50
Дошло! Давай, попробуем такую абракадабру: Иванов(а|ы|ым|у)?(?=[^a-zа-я]) Если в целом устроит, попробую объяснить (глядишь, и сам пойму), а потом дошлифуем
Ты видишь, я даже не включил заглавные буквы Кстати, о птичках заглавных буквах Обычно пишу их в шаблоне, а выше той же рукой аккуратно так выведено: .IgnoreCase = True... Слов нет! Границ слов почему-то не боюсь (наверное, я из страны непуганых дураков)
Дошло! Давай, попробуем такую абракадабру: Иванов(а|ы|ым|у)?(?=[^a-zа-я]) Если в целом устроит, попробую объяснить (глядишь, и сам пойму), а потом дошлифуем
Ты видишь, я даже не включил заглавные буквы Кстати, о птичках заглавных буквах Обычно пишу их в шаблоне, а выше той же рукой аккуратно так выведено: .IgnoreCase = True... Слов нет! Границ слов почему-то не боюсь (наверное, я из страны непуганых дураков)v__step
С уважением, Владимир
Сообщение отредактировал v__step - Четверг, 22.12.2011, 23:06
Я исправил "*" из предыдущего шаблона на "?", чтобы усилить определенность. Если мы работаем только с Кириллецей, лучше вместо [^a-zа-я] записать [^а-я]. Эта кроха найдет абсолютно все кроме а-я (пробелы, окончания строк и т.д.) Вообще, я бы шел дуболомным путем, ведь пробел после слова может быть и пропущен... Взял бы самый простой шаблон "Иванов(а|ы|ым|у)?", но до начала поиска заменил бы в исходной строке все нежелательные словоформы. В общем случае, когда интересны положения вхождений, заменил бы заполнителем ("Иванович" >> "@@@@@@@@"). А если нужны только Matches().Value, заменил бы на "".
Я исправил "*" из предыдущего шаблона на "?", чтобы усилить определенность. Если мы работаем только с Кириллецей, лучше вместо [^a-zа-я] записать [^а-я]. Эта кроха найдет абсолютно все кроме а-я (пробелы, окончания строк и т.д.) Вообще, я бы шел дуболомным путем, ведь пробел после слова может быть и пропущен... Взял бы самый простой шаблон "Иванов(а|ы|ым|у)?", но до начала поиска заменил бы в исходной строке все нежелательные словоформы. В общем случае, когда интересны положения вхождений, заменил бы заполнителем ("Иванович" >> "@@@@@@@@"). А если нужны только Matches().Value, заменил бы на "".v__step
С уважением, Владимир
Сообщение отредактировал v__step - Пятница, 23.12.2011, 09:40
Да ладно, Володя, не трать время. Просто меня заинтеревовал пример, приведенный на Специальные символы и подстановочные знаки в операциях поиска и замены Microsoft Word 97, где, используя метод .Find, в конце статьи очень лихо меняют в выделении фамилию Иванов на фамилию Петров сразу во всех падежах путем замены Ивано([а-я]@>) на Петро\1 Но это синтаксис поиска-замены Ворда, а он очень похож на синтаксис RegExp. Вот я и подумал, а нельзя ли сделать аналогично в VBA Excel ? Ведь @ в Ворде - это ноль или более штук предыдущего символа или выражения, т.е. эквивалент {0,} или ? в RegExp А > - это конец слова - эквивалент \b в RegExp Но ведь \b с кириллицей не работает …
Да ладно, Володя, не трать время. Просто меня заинтеревовал пример, приведенный на Специальные символы и подстановочные знаки в операциях поиска и замены Microsoft Word 97, где, используя метод .Find, в конце статьи очень лихо меняют в выделении фамилию Иванов на фамилию Петров сразу во всех падежах путем замены Ивано([а-я]@>) на Петро\1 Но это синтаксис поиска-замены Ворда, а он очень похож на синтаксис RegExp. Вот я и подумал, а нельзя ли сделать аналогично в VBA Excel ? Ведь @ в Ворде - это ноль или более штук предыдущего символа или выражения, т.е. эквивалент {0,} или ? в RegExp А > - это конец слова - эквивалент \b в RegExp Но ведь \b с кириллицей не работает … Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Пятница, 23.12.2011, 13:54
\s Любой пробельный символ кроме неразрывных пробелов, включая табуляцию, перевод строки, возврат каретки, перевод страницы. Эквивалентно [ \f\n\r\t\v] \S Любой ВИДИМЫЙ символ или неразрывный пробел (любой непробельный символ). Эквивалентно [^ \f\n\r\t\v]
\s Любой пробельный символ кроме неразрывных пробелов, включая табуляцию, перевод строки, возврат каретки, перевод страницы. Эквивалентно [ \f\n\r\t\v] \S Любой ВИДИМЫЙ символ или неразрывный пробел (любой непробельный символ). Эквивалентно [^ \f\n\r\t\v]
А зря не включил! Ведь мы делаем примеры для RegExp вообще, а не для конкретной твоей программы-тестера, который сам вставляет .IgnoreCase = True Поэтому для универсальности примера лучше как раз усилить паттерн: [^a-zA-Zа-яА-ЯёЁ]
Quote (v__step)
Ты видишь, я даже не включил заглавные буквы
А зря не включил! Ведь мы делаем примеры для RegExp вообще, а не для конкретной твоей программы-тестера, который сам вставляет .IgnoreCase = True Поэтому для универсальности примера лучше как раз усилить паттерн: [^a-zA-Zа-яА-ЯёЁ]Alex_ST
Ну, я, блин, динозавр замшелый … Не обратил внимание, что форум перебрался на другую страничку. А на предыдущей мой пост от 09:56 последний. Я тыкаю регулярно "обновить" - никто ничего нового не отвечает. Ну, думаю, заняты все. Извините, мужики! Александр, спасибо за файл. Скачал. Посмотрел. Но пока не изучил. Володя, Иванов(а|ы|ым|у)?(?=[^а-я]) отлично работает Правда я его из твоего предыдущего поста ещё утром умудрился скопировать в тестер с лишним пробелом на конце и поэтому прихватывались пробелы, что мне, конечно, не понравилось, но тебя-то на форуме "не было", как мне казалось … Я для универсальности решения всё-таки ужесточил паттерн: Иванов(а|ы|ым|у)?(?=[^a-zA-Zа-яА-ЯёЁ]) Очень здорово получилось: даже переводы строки и знаки препинания, поставленные сразу после Иванова, RegExp не сбивают! Теперь бы понять, как это работает...
Ну, я, блин, динозавр замшелый … Не обратил внимание, что форум перебрался на другую страничку. А на предыдущей мой пост от 09:56 последний. Я тыкаю регулярно "обновить" - никто ничего нового не отвечает. Ну, думаю, заняты все. Извините, мужики! Александр, спасибо за файл. Скачал. Посмотрел. Но пока не изучил. Володя, Иванов(а|ы|ым|у)?(?=[^а-я]) отлично работает Правда я его из твоего предыдущего поста ещё утром умудрился скопировать в тестер с лишним пробелом на конце и поэтому прихватывались пробелы, что мне, конечно, не понравилось, но тебя-то на форуме "не было", как мне казалось … Я для универсальности решения всё-таки ужесточил паттерн: Иванов(а|ы|ым|у)?(?=[^a-zA-Zа-яА-ЯёЁ]) Очень здорово получилось: даже переводы строки и знаки препинания, поставленные сразу после Иванова, RegExp не сбивают! Теперь бы понять, как это работает...Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Пятница, 23.12.2011, 15:01
Лёш, ты предложил очень красивую задачу, я не мог не принять такой вызов! Иванов это понятно (а|ы|ым|у)? это тоже понятно (* пришлось заменить на ?, потому что нам не нужны лишние вхождения) (?= это шапка просмотра вперед (как If, With) [^a-zA-Zа-яА-ЯёЁ] это шаблон просмотра вперед (соответствующий текст будет найден, но не включен в результат) ) это хвост просмотра вперед (как End If, End With) По поводу A-Zа-яА-ЯёЁ согласен Для себя я всегда стараюсь применять решения "по месту", всячески избегаю лишних настроек приложения, лишних переменных, лишних опций. Это очень помогает, а часто просто спасает (синица в руке)
Лёш, ты предложил очень красивую задачу, я не мог не принять такой вызов! Иванов это понятно (а|ы|ым|у)? это тоже понятно (* пришлось заменить на ?, потому что нам не нужны лишние вхождения) (?= это шапка просмотра вперед (как If, With) [^a-zA-Zа-яА-ЯёЁ] это шаблон просмотра вперед (соответствующий текст будет найден, но не включен в результат) ) это хвост просмотра вперед (как End If, End With) По поводу A-Zа-яА-ЯёЁ согласен Для себя я всегда стараюсь применять решения "по месту", всячески избегаю лишних настроек приложения, лишних переменных, лишних опций. Это очень помогает, а часто просто спасает (синица в руке)v__step
С уважением, Владимир
Сообщение отредактировал v__step - Пятница, 23.12.2011, 16:26
Володя, пришла мысль: вместо примеров на твоём листе "метасимволы+" поместить тестеры! Начал. Здорово получается! Но продолжить смогу только в понедельник... Вот, посмотри начало:
Володя, пришла мысль: вместо примеров на твоём листе "метасимволы+" поместить тестеры! Начал. Здорово получается! Но продолжить смогу только в понедельник... Вот, посмотри начало:Alex_ST
Последний штрих: [^a-zA-ZА-яёЁ] (В таблице ASC кириллица, в отличие от латиницы, идет подряд от А до я)
Похожее решение: Иванов(а|ы|ым|у)?(?![a-zA-ZА-яёЁ]) Я заменил "=" на "!" и убрал из набора "^" Теперь наш просмотр вперед стал негативным
(?! это шапка негативного просмотра вперед (как If, With) [a-zA-ZА-яёЁ] это шаблон негативного просмотра вперед (все кроме соответствующего текста будет найдено, но не включено в результат) ) это хвост негативного просмотра вперед (как End If, End With)
А еще ты подал красивую идею коротких и чистых примеров для "*" (очень не хватало) В них, в отличие от многих других, приводимых в таблицах метасимволов, "*" нельзя заменить на "+" или "?" Текст: "Иван Иваныч Иванов" Шаблон: "иван\S*" Текст: "Триста тридцать три" Шаблон: "три\S*" и т.п.
Последний штрих: [^a-zA-ZА-яёЁ] (В таблице ASC кириллица, в отличие от латиницы, идет подряд от А до я)
Похожее решение: Иванов(а|ы|ым|у)?(?![a-zA-ZА-яёЁ]) Я заменил "=" на "!" и убрал из набора "^" Теперь наш просмотр вперед стал негативным
(?! это шапка негативного просмотра вперед (как If, With) [a-zA-ZА-яёЁ] это шаблон негативного просмотра вперед (все кроме соответствующего текста будет найдено, но не включено в результат) ) это хвост негативного просмотра вперед (как End If, End With)
А еще ты подал красивую идею коротких и чистых примеров для "*" (очень не хватало) В них, в отличие от многих других, приводимых в таблицах метасимволов, "*" нельзя заменить на "+" или "?" Текст: "Иван Иваныч Иванов" Шаблон: "иван\S*" Текст: "Триста тридцать три" Шаблон: "три\S*" и т.п.v__step
С уважением, Владимир
Сообщение отредактировал v__step - Суббота, 24.12.2011, 14:51
Добиваю примеры... Поднялся вопрос Задача та же: фамилию Иванов с любым падежным окончанием (а|у|ым|е) заменить на фамилию Сидоров с теми же падежными окончаниями. Ищем по шаблону Иванов(а|у|ым|е)?(?![a-zA-Zа-яА-ЯёЁ]) заменяем на Сидоров$1 Вопрос: как изменить шаблон чтобы кроме Иванов не прихватывался ещё и Ливанов ? Я понимаю, что, наверное, проще всего сделать IgnoreCase = False, но всё-таки?
К стати, я сделал в тестере на каждом листе гульку, позволяющую оперативно управлять параметром IgnoreCase (все "гульки" связаны с одной и той же ячейкой-именованным диапазоном Е1=bIgnoreCase на листе "Метасимволы+" Кроме того, разделители элементов коллекций Matches и SubMatches задаются в ячейках-именованных диапазонах I1=dlmMatches , L1=dlmSubMatches на листе "Метасимволы+"
И ещё: что-то никак не "докурю" как исправить код fRegExSubMatches чтобы не выводились разделители Matches когда SubMatches нет? Посмотри на листах. Будет понятнее, о чём говорю. Или SubMatches всё-таки создаются, но пустые? Ведь формулы есть во всех ячейках столбца, куда выводятся SubMatches, а пустые разделители Matches - не везде? Что там теория RegExp говорит про то, при каких шаблонах SubMatches создаются и когда они создаются, но пустые?
Добиваю примеры... Поднялся вопрос Задача та же: фамилию Иванов с любым падежным окончанием (а|у|ым|е) заменить на фамилию Сидоров с теми же падежными окончаниями. Ищем по шаблону Иванов(а|у|ым|е)?(?![a-zA-Zа-яА-ЯёЁ]) заменяем на Сидоров$1 Вопрос: как изменить шаблон чтобы кроме Иванов не прихватывался ещё и Ливанов ? Я понимаю, что, наверное, проще всего сделать IgnoreCase = False, но всё-таки?
К стати, я сделал в тестере на каждом листе гульку, позволяющую оперативно управлять параметром IgnoreCase (все "гульки" связаны с одной и той же ячейкой-именованным диапазоном Е1=bIgnoreCase на листе "Метасимволы+" Кроме того, разделители элементов коллекций Matches и SubMatches задаются в ячейках-именованных диапазонах I1=dlmMatches , L1=dlmSubMatches на листе "Метасимволы+"
И ещё: что-то никак не "докурю" как исправить код fRegExSubMatches чтобы не выводились разделители Matches когда SubMatches нет? Посмотри на листах. Будет понятнее, о чём говорю. Или SubMatches всё-таки создаются, но пустые? Ведь формулы есть во всех ячейках столбца, куда выводятся SubMatches, а пустые разделители Matches - не везде? Что там теория RegExp говорит про то, при каких шаблонах SubMatches создаются и когда они создаются, но пустые?Alex_ST