Я заметила, что в последнее время на форуме часто стали появляться решения задач с использованием регулярных выражений. В связи с чем, я и сама прониклась этой интересной штуковиной под названием RegExp. )) Ну а т.к. я человек ленивый, надоело мне каждый раз писать один и тот же кусок кода, меняя в нем только строку шаблона. :D
Соорудила 3 UDF-ки, теперь хочу поделиться ими с вами: stringRegExpTest - проверяет, соответствует строка шаблону stringRegExpExecute - ищет в строке подстроки, соответствующие шаблону stringRegExpReplace - заменяет в строке вхождения, соответствующие шаблону на заданную подстроку.
Шаблоны (Pattern) строятся точно так же, как и при использовании регулярок в VBA. Свойства Global, IgnoreCase и MultiLine во всех функциях заданы, как необязательные аргументы (дефолтные значения можно поменять на свой вкус).
В файле набросала несколько задач, которые можно решать с помощью регулярных выражений. Т.к. с шаблонами я пока на Вы, примеры не очень сложные. Если у кого-то в закромах есть супер-пупер заумные/полезные шаблоны, предлагаю пополнить ими мой файлик.))
[p.s.]Долго искала тему про RegExp'ы в готовых решениях и Полезных приемах, но так и не нашла... После того, как наклепала свои udf-ки, и практически дописала этот пост, случайно наткнулась в разделе вопросов по Excel на Поговорим про RegExp?)) По приведенной мною ссылке можно найти описания для всех свойств и методов регулярок, а также списки метасимволов для шаблонов.[/p.s.]
Здравствуйте, уважаемые друзья и коллеги!
Я заметила, что в последнее время на форуме часто стали появляться решения задач с использованием регулярных выражений. В связи с чем, я и сама прониклась этой интересной штуковиной под названием RegExp. )) Ну а т.к. я человек ленивый, надоело мне каждый раз писать один и тот же кусок кода, меняя в нем только строку шаблона. :D
Соорудила 3 UDF-ки, теперь хочу поделиться ими с вами: stringRegExpTest - проверяет, соответствует строка шаблону stringRegExpExecute - ищет в строке подстроки, соответствующие шаблону stringRegExpReplace - заменяет в строке вхождения, соответствующие шаблону на заданную подстроку.
Шаблоны (Pattern) строятся точно так же, как и при использовании регулярок в VBA. Свойства Global, IgnoreCase и MultiLine во всех функциях заданы, как необязательные аргументы (дефолтные значения можно поменять на свой вкус).
В файле набросала несколько задач, которые можно решать с помощью регулярных выражений. Т.к. с шаблонами я пока на Вы, примеры не очень сложные. Если у кого-то в закромах есть супер-пупер заумные/полезные шаблоны, предлагаю пополнить ими мой файлик.))
[p.s.]Долго искала тему про RegExp'ы в готовых решениях и Полезных приемах, но так и не нашла... После того, как наклепала свои udf-ки, и практически дописала этот пост, случайно наткнулась в разделе вопросов по Excel на Поговорим про RegExp?)) По приведенной мною ссылке можно найти описания для всех свойств и методов регулярок, а также списки метасимволов для шаблонов.[/p.s.]Manyasha
Соорудила 3 UDF-ки, теперь хочу поделиться ими с вами:
а я пользуюсь только 2-мя. : RegExpFindReplace и RegExpFind.
Докину еще парочку ссылок, если не возражаешь: тут я нашел когда то - готовый тестер регулярок с Юдф-ками, похожими на твои . RegExpFindReplace RegExpFind RegExpTest Сам файл - тестер в приложении. А это, для меня, просто незаменимый сайт для создания и наглядной проверки регулярок. там же есть куча готовых шаблонов в разделе "community"
Соорудила 3 UDF-ки, теперь хочу поделиться ими с вами:
а я пользуюсь только 2-мя. : RegExpFindReplace и RegExpFind.
Докину еще парочку ссылок, если не возражаешь: тут я нашел когда то - готовый тестер регулярок с Юдф-ками, похожими на твои . RegExpFindReplace RegExpFind RegExpTest Сам файл - тестер в приложении. А это, для меня, просто незаменимый сайт для создания и наглядной проверки регулярок. там же есть куча готовых шаблонов в разделе "community"SLAVICK
Ниже перечислены аргументы:Элемент Описание Строка Обрабатываемая строка Шаблон Шаблон регулярного выражения НомерСовпадения Вернуть совпадение по номеру. 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
Ниже перечислены аргументы:Элемент Описание Строка Обрабатываемая строка Шаблон Шаблон регулярного выражения НомерСовпадения Вернуть совпадение по номеру. 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
Что-то последнее время частенько к регуляркам прибегаем - выкладываю свои функции, можно на надстройку повесить - вдруг кому пригодится
[vba]
Код
Option Explicit Function reg_заменить(t$, p$, r$, Optional g = True, Optional i = True) Application.Volatile With CreateObject("VBScript.RegExp") .Global = g .IgnoreCase = i .Pattern = p reg_заменить = .Replace(t, r) End With End Function
Function reg_извлечь(t$, p$, Optional n = 1) Application.Volatile With CreateObject("VBScript.RegExp") If n > 1 Then .Global = True .Pattern = p reg_извлечь = .Execute(t)(n - 1) End With End Function
Function reg_тест(t$, p$) Application.Volatile With CreateObject("VBScript.RegExp") .Pattern = p reg_тест = .Test(t) End With End Function
[/vba]
Что-то последнее время частенько к регуляркам прибегаем - выкладываю свои функции, можно на надстройку повесить - вдруг кому пригодится
[vba]
Код
Option Explicit Function reg_заменить(t$, p$, r$, Optional g = True, Optional i = True) Application.Volatile With CreateObject("VBScript.RegExp") .Global = g .IgnoreCase = i .Pattern = p reg_заменить = .Replace(t, r) End With End Function
Function reg_извлечь(t$, p$, Optional n = 1) Application.Volatile With CreateObject("VBScript.RegExp") If n > 1 Then .Global = True .Pattern = p reg_извлечь = .Execute(t)(n - 1) End With End Function
Function reg_тест(t$, p$) Application.Volatile With CreateObject("VBScript.RegExp") .Pattern = p reg_тест = .Test(t) End With End Function