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

Вход

Регистрация

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

 

= Мир MS Excel/UDF-ки для использования RegExp и их методов - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
UDF-ки для использования RegExp и их методов
Manyasha Дата: Четверг, 21.07.2016, 17:55 | Сообщение № 1
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 901 ±
Замечаний: 0% ±

Excel 2010, 2016
Здравствуйте, уважаемые друзья и коллеги!

Я заметила, что в последнее время на форуме часто стали появляться решения задач с использованием регулярных выражений. В связи с чем, я и сама прониклась этой интересной штуковиной под названием RegExp. ))
Ну а т.к. я человек ленивый, надоело мне каждый раз писать один и тот же кусок кода, меняя в нем только строку шаблона. :D

Соорудила 3 UDF-ки, теперь хочу поделиться ими с вами:
stringRegExpTest - проверяет, соответствует строка шаблону
stringRegExpExecute - ищет в строке подстроки, соответствующие шаблону
stringRegExpReplace - заменяет в строке вхождения, соответствующие шаблону на заданную подстроку.

Шаблоны (Pattern) строятся точно так же, как и при использовании регулярок в VBA.
Свойства Global, IgnoreCase и MultiLine во всех функциях заданы, как необязательные аргументы (дефолтные значения можно поменять на свой вкус).

В файле набросала несколько задач, которые можно решать с помощью регулярных выражений. Т.к. с шаблонами я пока на Вы, примеры не очень сложные. Если у кого-то в закромах есть супер-пупер заумные/полезные шаблоны, предлагаю пополнить ими мой файлик.))

[p.s.]Долго искала тему про RegExp'ы в готовых решениях и Полезных приемах, но так и не нашла... После того, как наклепала свои udf-ки, и практически дописала этот пост, случайно наткнулась в разделе вопросов по Excel на Поговорим про RegExp?))
По приведенной мною ссылке можно найти описания для всех свойств и методов регулярок, а также списки метасимволов для шаблонов.[/p.s.]
К сообщению приложен файл: regExpUDF.xls (56.0 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеЗдравствуйте, уважаемые друзья и коллеги!

Я заметила, что в последнее время на форуме часто стали появляться решения задач с использованием регулярных выражений. В связи с чем, я и сама прониклась этой интересной штуковиной под названием RegExp. ))
Ну а т.к. я человек ленивый, надоело мне каждый раз писать один и тот же кусок кода, меняя в нем только строку шаблона. :D

Соорудила 3 UDF-ки, теперь хочу поделиться ими с вами:
stringRegExpTest - проверяет, соответствует строка шаблону
stringRegExpExecute - ищет в строке подстроки, соответствующие шаблону
stringRegExpReplace - заменяет в строке вхождения, соответствующие шаблону на заданную подстроку.

Шаблоны (Pattern) строятся точно так же, как и при использовании регулярок в VBA.
Свойства Global, IgnoreCase и MultiLine во всех функциях заданы, как необязательные аргументы (дефолтные значения можно поменять на свой вкус).

В файле набросала несколько задач, которые можно решать с помощью регулярных выражений. Т.к. с шаблонами я пока на Вы, примеры не очень сложные. Если у кого-то в закромах есть супер-пупер заумные/полезные шаблоны, предлагаю пополнить ими мой файлик.))

[p.s.]Долго искала тему про RegExp'ы в готовых решениях и Полезных приемах, но так и не нашла... После того, как наклепала свои udf-ки, и практически дописала этот пост, случайно наткнулась в разделе вопросов по Excel на Поговорим про RegExp?))
По приведенной мною ссылке можно найти описания для всех свойств и методов регулярок, а также списки метасимволов для шаблонов.[/p.s.]

Автор - Manyasha
Дата добавления - 21.07.2016 в 17:55
SLAVICK Дата: Четверг, 21.07.2016, 19:04 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Соорудила 3 UDF-ки, теперь хочу поделиться ими с вами:

а я пользуюсь только 2-мя. :D :
RegExpFindReplace и RegExpFind.

Докину еще парочку ссылок, если не возражаешь:
тут я нашел когда то - готовый тестер регулярок с Юдф-ками, похожими на твои :D .
RegExpFindReplace
RegExpFind
RegExpTest
Сам файл - тестер в приложении.
А это, для меня, просто незаменимый сайт для создания и наглядной проверки регулярок. там же есть куча готовых шаблонов в разделе "community"
К сообщению приложен файл: RegExp_Tester.xlsm (31.0 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
Соорудила 3 UDF-ки, теперь хочу поделиться ими с вами:

а я пользуюсь только 2-мя. :D :
RegExpFindReplace и RegExpFind.

Докину еще парочку ссылок, если не возражаешь:
тут я нашел когда то - готовый тестер регулярок с Юдф-ками, похожими на твои :D .
RegExpFindReplace
RegExpFind
RegExpTest
Сам файл - тестер в приложении.
А это, для меня, просто незаменимый сайт для создания и наглядной проверки регулярок. там же есть куча готовых шаблонов в разделе "community"

Автор - SLAVICK
Дата добавления - 21.07.2016 в 19:04
RAN Дата: Четверг, 21.07.2016, 19:43 | Сообщение № 3
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
лень матушка от ikki
это же есть и где-то на Планете


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщениелень матушка от ikki
это же есть и где-то на Планете

Автор - RAN
Дата добавления - 21.07.2016 в 19:43
Manyasha Дата: Четверг, 21.07.2016, 22:21 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 901 ±
Замечаний: 0% ±

Excel 2010, 2016
Спасибо за ссылки и примеры!)) Все себе понатырила :)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеСпасибо за ссылки и примеры!)) Все себе понатырила :)

Автор - Manyasha
Дата добавления - 21.07.2016 в 22:21
PowerBoy Дата: Пятница, 22.07.2016, 08:03 | Сообщение № 5
Группа: Проверенные
Ранг: Участник
Сообщений: 100
Репутация: 31 ±
Замечаний: 0% ±

2003
Я использую свою функцию, объединенную из stringRegExpExecute и stringRegExpReplace

Синтаксис
=ATREGEX(Строка,Шаблон,[НомерСовпадения],[НоваяСтрока],[ИгнорироватьРегистр],[Глобально])

Ниже перечислены аргументы:Элемент Описание
Строка Обрабатываемая строка
Шаблон Шаблон регулярного выражения
НомерСовпадения Вернуть совпадение по номеру.
0 - вернуть список совпадений через запятую.
-1 - вернуть количество совпадений.
-2 - вернуть сумму чисел совпадений.
НоваяСтрока Заменить совпадения на новую строку
ИгнорироватьРегистр Игнорировать регистр букв. (Вкл. по умолчанию)
Глобально Применить ко всем. (Вкл. по умолчанию)

[vba]
Код

Public Function ATREGEX(ByRef text As Variant, _
                        ByRef pattern As Variant, _
                        Optional ByVal num_submatch As Long = -10, _
                        Optional ByRef new_text As Variant = "", _
                        Optional ByVal is_ignoreCase As Boolean = True, _
                        Optional ByVal is_global As Boolean = True) As Variant

Dim objRegex
Dim colMatch
Dim sMatchString As String
Dim sSumMatch As Double
Dim i As Integer

On Error GoTo err_

ATREGEX = ""

Set objRegex = CreateObject("vbscript.regexp")

With objRegex
    .Global = is_global
    .IgnoreCase = is_ignoreCase
    .pattern = pattern
End With

If num_submatch >= -9 Then
    Set colMatch = objRegex.Execute(text)
    
    If num_submatch = -1 Then
        ATREGEX = colMatch.Count
        Exit Function
    End If
    
    If num_submatch = -2 Then
        sSumMatch = 0
        For i = 0 To colMatch.Count - 1
            sSumMatch = sSumMatch + CDbl(colMatch(i).Value)
        Next
        ATREGEX = sSumMatch
        Exit Function
    End If
    
    If colMatch.Count = 0 Then
        ATREGEX = ""
    Else
        If num_submatch = 0 Then
            sMatchString = ""
            For i = 0 To colMatch.Count - 1
                sMatchString = sMatchString + CStr(colMatch(i).Value) + ","
            Next
            ATREGEX = Left(sMatchString, Len(sMatchString) - 1)
        Else
            ATREGEX = colMatch(num_submatch - 1)
        End If
    End If
Else
    ATREGEX = objRegex.Replace(text, new_text)
End If

err_:
End Function
[/vba]

=ATREGEX("вер5мод12";"\d+") => вермод
=ATREGEX("вер5мод12";"\d+";1) => 5
=ATREGEX("вер5мод12";"\d+";2) => 12
=ATREGEX("вер5мод12";"\d+";0) => 5,12
=ATREGEX("вер5мод12";"\d+";-1) =>2
=ATREGEX("вер5мод12";"\d+";-2) =>17
=ATREGEX("вер5мод12";"\d+";;"AA") => верAAмодAA


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)
 
Ответить
СообщениеЯ использую свою функцию, объединенную из stringRegExpExecute и stringRegExpReplace

Синтаксис
=ATREGEX(Строка,Шаблон,[НомерСовпадения],[НоваяСтрока],[ИгнорироватьРегистр],[Глобально])

Ниже перечислены аргументы:Элемент Описание
Строка Обрабатываемая строка
Шаблон Шаблон регулярного выражения
НомерСовпадения Вернуть совпадение по номеру.
0 - вернуть список совпадений через запятую.
-1 - вернуть количество совпадений.
-2 - вернуть сумму чисел совпадений.
НоваяСтрока Заменить совпадения на новую строку
ИгнорироватьРегистр Игнорировать регистр букв. (Вкл. по умолчанию)
Глобально Применить ко всем. (Вкл. по умолчанию)

[vba]
Код

Public Function ATREGEX(ByRef text As Variant, _
                        ByRef pattern As Variant, _
                        Optional ByVal num_submatch As Long = -10, _
                        Optional ByRef new_text As Variant = "", _
                        Optional ByVal is_ignoreCase As Boolean = True, _
                        Optional ByVal is_global As Boolean = True) As Variant

Dim objRegex
Dim colMatch
Dim sMatchString As String
Dim sSumMatch As Double
Dim i As Integer

On Error GoTo err_

ATREGEX = ""

Set objRegex = CreateObject("vbscript.regexp")

With objRegex
    .Global = is_global
    .IgnoreCase = is_ignoreCase
    .pattern = pattern
End With

If num_submatch >= -9 Then
    Set colMatch = objRegex.Execute(text)
    
    If num_submatch = -1 Then
        ATREGEX = colMatch.Count
        Exit Function
    End If
    
    If num_submatch = -2 Then
        sSumMatch = 0
        For i = 0 To colMatch.Count - 1
            sSumMatch = sSumMatch + CDbl(colMatch(i).Value)
        Next
        ATREGEX = sSumMatch
        Exit Function
    End If
    
    If colMatch.Count = 0 Then
        ATREGEX = ""
    Else
        If num_submatch = 0 Then
            sMatchString = ""
            For i = 0 To colMatch.Count - 1
                sMatchString = sMatchString + CStr(colMatch(i).Value) + ","
            Next
            ATREGEX = Left(sMatchString, Len(sMatchString) - 1)
        Else
            ATREGEX = colMatch(num_submatch - 1)
        End If
    End If
Else
    ATREGEX = objRegex.Replace(text, new_text)
End If

err_:
End Function
[/vba]

=ATREGEX("вер5мод12";"\d+") => вермод
=ATREGEX("вер5мод12";"\d+";1) => 5
=ATREGEX("вер5мод12";"\d+";2) => 12
=ATREGEX("вер5мод12";"\d+";0) => 5,12
=ATREGEX("вер5мод12";"\d+";-1) =>2
=ATREGEX("вер5мод12";"\d+";-2) =>17
=ATREGEX("вер5мод12";"\d+";;"AA") => верAAмодAA

Автор - PowerBoy
Дата добавления - 22.07.2016 в 08:03
SLAVICK Дата: Пятница, 22.07.2016, 11:53 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
лень матушка от ikki

вот это ikki соорудил монстра - пока понял что к чему %) . пусть земля ему будет пухом.

Я использую свою функцию, объединенную из stringRegExpExecute и stringRegExpReplace

Интересная задумка.

Позволю себе дать несколько пожеланий.
вернуть список совпадений через запятую.

лучше разделитель - сделать опционным с возможностью изменения а то вдруг нужно вытянуть тексты с запятой :o .

-2 - вернуть сумму чисел совпадений.

Как по мне, сумма чисел - лишняя плюшка. (лично для меня -- я редко вытаскиваю именно числа, не говоря уж об их суммировании)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
лень матушка от ikki

вот это ikki соорудил монстра - пока понял что к чему %) . пусть земля ему будет пухом.

Я использую свою функцию, объединенную из stringRegExpExecute и stringRegExpReplace

Интересная задумка.

Позволю себе дать несколько пожеланий.
вернуть список совпадений через запятую.

лучше разделитель - сделать опционным с возможностью изменения а то вдруг нужно вытянуть тексты с запятой :o .

-2 - вернуть сумму чисел совпадений.

Как по мне, сумма чисел - лишняя плюшка. (лично для меня -- я редко вытаскиваю именно числа, не говоря уж об их суммировании)

Автор - SLAVICK
Дата добавления - 22.07.2016 в 11:53
buchlotnik Дата: Понедельник, 11.09.2017, 22:06 | Сообщение № 7
Группа: Заблокированные
Ранг: Участник клуба
Сообщений: 3442
Репутация: 929 ±
Замечаний: 20% ±

2010, 2013, 2016 RUS / ENG
Что-то последнее время частенько к регуляркам прибегаем - выкладываю свои функции, можно на надстройку повесить - вдруг кому пригодится
К сообщению приложен файл: 3668544.xlsm (14.8 Kb)
 
Ответить
СообщениеЧто-то последнее время частенько к регуляркам прибегаем - выкладываю свои функции, можно на надстройку повесить - вдруг кому пригодится

Автор - buchlotnik
Дата добавления - 11.09.2017 в 22:06
SLAVICK Дата: Понедельник, 11.09.2017, 22:26 | Сообщение № 8
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
- выкладываю свои функции,

А в чем отличие от этой темы (также готового решения)?


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
- выкладываю свои функции,

А в чем отличие от этой темы (также готового решения)?

Автор - SLAVICK
Дата добавления - 11.09.2017 в 22:26
buchlotnik Дата: Понедельник, 11.09.2017, 22:35 | Сообщение № 9
Группа: Заблокированные
Ранг: Участник клуба
Сообщений: 3442
Репутация: 929 ±
Замечаний: 20% ±

2010, 2013, 2016 RUS / ENG
SLAVICK, точняк - как-то подзабыл - можно туда перенести?
 
Ответить
СообщениеSLAVICK, точняк - как-то подзабыл - можно туда перенести?

Автор - buchlotnik
Дата добавления - 11.09.2017 в 22:35
SLAVICK Дата: Понедельник, 11.09.2017, 22:36 | Сообщение № 10
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Готово :D


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеГотово :D

Автор - SLAVICK
Дата добавления - 11.09.2017 в 22:36
  • Страница 1 из 1
  • 1
Поиск:

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