Как использовать регулярные выражения (Regex) в Microsoft Excel как внутри ячейки, так и в циклах

592

Как я могу использовать регулярные выражения в Excel и использовать мощные сетчатые настройки Excel для манипулирования данными?

  • Функция в ячейке, чтобы возвратить совпавший образец или замененное значение в строке.
  • Sub для циклического перебора столбца данных и извлечения совпадений для соседних ячеек.
  • Какая настройка нужна?
  • Каковы специальные символы Excel для регулярных выражений?

Я понимаю , Regex не является идеальным для многих ситуаций ( использовать или не использовать регулярные выражения? ) , Так как Excel можно использовать Left, Mid, Right, Instrкоманды типа для подобных манипуляций.

Портлендский Бегун
источник
11
Я очень рекомендую эту статью VB / VBA Regexp Патрика Мэтьюса
brettdj
1
Попробуйте это бесплатное дополнение: seotoolsforexcel.com/regexpfind
Нильс Босма
1
Давайте не будем забывать об Like операторе , который предоставляет своего рода облегченную версию функциональности в стиле регулярных выражений. Как правило, это намного быстрее, чем регулярное выражение, даже если обернут в процедуру sub или функции.
Egalth

Ответы:

955

Регулярные выражения используются для сопоставления с образцом.

Чтобы использовать в Excel, выполните следующие действия:

Шаг 1. Добавьте ссылку на VBA в «Регулярные выражения Microsoft VBScript 5.5»

  • Выберите вкладку «Разработчик» ( у меня нет этой вкладки, что мне делать? )
  • Выберите значок «Visual Basic» в разделе ленты «Код»
  • В окне «Microsoft Visual Basic для приложений» выберите «Инструменты» в верхнем меню.
  • Выберите «Рекомендации»
  • Установите флажок «Регулярные выражения Microsoft VBScript 5.5», чтобы включить его в свою книгу.
  • Нажмите "ОК"

Шаг 2 : Определите свой шаблон

Основные определения:

- Спектр.

  • Например, a-zсоответствует строчным буквам от а до я
  • Например, 0-5соответствует любое число от 0 до 5

[] Совпадение точно с одним из объектов в этих скобках.

  • Например, [a]соответствует букве а
  • Например, [abc]соответствует одной букве, которая может быть a, b или c
  • Например, [a-z]соответствует любой строчной букве алфавита.

()Группы разных совпадений для целей возврата. Смотрите примеры ниже.

{} Множитель для повторных копий шаблона, определенного перед ним.

  • Например, [a]{2}соответствует две последовательные строчные буквы:aa
  • Например , [a]{1,3}соответствует по крайней мере , один и до три строчной буквы a, aa,aaa

+ Сопоставьте хотя бы один или несколько шаблонов, определенных перед ним.

  • Например , a+будет соответствовать последовательным элементам а a, aa, aaaи т.д.

? Совпадение нуля или одного из шаблонов, определенных перед ним.

  • Например, шаблон может присутствовать или не присутствовать, но может быть сопоставлен только один раз.
  • Например, [a-z]?соответствует пустой строке или любой отдельной строчной букве.

* Сопоставьте ноль или более шаблона, определенного перед ним. - Например, подстановочный знак для шаблона, который может присутствовать или не присутствовать. - Например, [a-z]*соответствует пустой строке или строке строчных букв.

. Соответствует любому символу, кроме новой строки \n

  • Например, a.Соответствует двухсимвольной строке, начинающейся с a и заканчивающейся чем угодно, кроме\n

| Оператор ИЛИ

  • Например, a|bозначает либо aили bможет быть сопоставлено.
  • Например, red|white|orangeсоответствует точно один из цветов.

^ НЕ оператор

  • Например, [^0-9]символ не может содержать число
  • Например, [^aA]символ не может быть строчным aили прописнымA

\ Выход из специального символа, который следует (переопределяет поведение выше)

  • Например \., \\, \(, \?, \$,\^

Закрепление паттернов:

^ Совпадение должно происходить в начале строки

  • Например, ^aпервый символ должен быть строчной буквойa
  • Например, ^[0-9]первый символ должен быть числом.

$ Соответствие должно происходить в конце строки

  • Например, a$последний символ должен быть строчной буквойa

Таблица приоритетов:

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |

Предопределенные сокращения символов:

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line

Пример 1 : Запуск от имени макроса

В следующем примере макроса выполняется поиск значения в ячейке, A1чтобы определить, являются ли первые 1 или 2 символа цифрами. Если это так, они удаляются, и отображается остальная часть строки. Если нет, то появится окно, сообщающее, что совпадений не найдено. Вернутся A1значения ячеек 12abc, вернется abcзначение 1abc, вернется abcзначение abc123«Не соответствует», потому что цифры не были в начале строки.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1")

    If strPattern <> "" Then
        strInput = Myrange.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub

Пример 2 : Запуск в качестве функции в ячейке

Этот пример аналогичен примеру 1, но настроен для запуска в качестве функции в ячейке. Чтобы использовать, измените код на это:

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String


    strPattern = "^[0-9]{1,3}"

    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

Поместите свои строки ("12abc") в клетку A1. Введите эту формулу =simpleCellRegex(A1)в ячейку, B1и результат будет «abc».

изображение результатов


Пример 3 : проходной цикл

Этот пример аналогичен примеру 1, но проходит через ряд ячеек.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A5")

    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub

Пример 4 : Разделение разных шаблонов

В этом примере выполняется циклический просмотр диапазона ( A1, A2& A3) и поиск строки, начинающейся с трех цифр, за которыми следует один буквенный символ, а затем 4 цифровых знака. Выходные данные разделяются на совпадения шаблона на соседние ячейки с помощью (). $1представляет собой первый образец согласованного в пределах первого набора ().

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A3")

    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"

        If strPattern <> "" Then
            strInput = C.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

Результаты:

изображение результатов


Дополнительные примеры шаблонов

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \<\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit
Портлендский Бегун
источник
22
Вы не должны забывать Set regEx = Nothing. Вы получите исключения «Недостаточно памяти», когда этот саб выполняется достаточно часто.
Кирилл
1
Я адаптировал пример 4 с SubMatches для обработки более сложных регулярных выражений, в основном, я не использую замену при расщеплении, если кому-то интересно: stackoverflow.com/questions/30218413/…
Armfoot
11
Поздняя переплетная линия:Set regEx = CreateObject("VBScript.RegExp")
ZygD
2
Хорошо, я уверен, что это потому, что код в ThisWorkbook. Попробуйте переместить код в отдельный Module.
Портленд Бегун
3
@PortlandRunner в «проводнике проекта» (?) В этом файле Excel отсутствовала подпапка «Модули», хотя в другом файле она была показана. Щелкните файл правой кнопкой мыши и выберите «вставить модуль», затем дважды щелкните «Модуль 1» и вставьте код. Сохраненный. Вернулись к книге и снова набрали функцию - все заработало. Может быть заслуживает внимания в ответ, ради таких неопытных, как я? Спасибо за помощь.
youcantryreachingme
205

Чтобы использовать регулярные выражения непосредственно в формулах Excel, может помочь следующая UDF (пользовательская функция). Он более или менее прямо представляет функцию регулярного выражения как функцию Excel.

Как это работает

Требуется 2-3 параметра.

  1. Текст для использования регулярного выражения.
  2. Регулярное выражение.
  3. Строка формата, определяющая, как должен выглядеть результат. Он может содержать $0, $1, $2и так далее. $0является полным соответствием, $1и up соответствуют соответствующим группам соответствия в регулярном выражении. Значения по умолчанию для $0.

Некоторые примеры

Извлечение адреса электронной почты:

=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")

Результаты в: some@email.com

Извлечение нескольких подстрок:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

Результаты в: E-Mail: some@email.com, Name: Peter Gordon

Чтобы разделить объединенную строку в одной ячейке на ее компоненты в нескольких ячейках:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)

Результаты в: Peter Gordon some@email.com...

Как пользоваться

Чтобы использовать этот UDF, сделайте следующее (грубо говоря, на этой странице Microsoft . У них есть хорошая дополнительная информация!):

  1. В Excel в файле с поддержкой макросов («.xlsm») нажмите, ALT+F11чтобы открыть редактор Microsoft Visual Basic для приложений .
  2. Добавьте ссылку на VBA в библиотеку регулярных выражений (бесстыдно скопировано из ответа Portland Runners ++ ):
    1. Нажмите на Инструменты -> Ссылки (извините за скриншот на немецком) Сервис -> Рекомендации
    2. Найдите в списке регулярные выражения Microsoft VBScript 5.5 и поставьте флажок рядом с ним.
    3. Нажмите ОК .
  3. Нажмите на Вставить модуль . Если вы даете модуль другое имени убедитесь , что модуль имеет не иметь такое же имя , как ОДС ниже (например , именование модуля Regexи функция regexвызывает #NAME! Ошибка).

    Второй значок в ряду значков -> Модуль

  4. В большом текстовом окне посередине вставьте следующее:

    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
  5. Сохраните и закройте окно редактора Microsoft Visual Basic для приложений .

Патрик Бёкер
источник
6
Ответ на этот вопрос в сочетании с шагами здесь , чтобы создать Add-In, было очень полезно. Спасибо. Убедитесь, что вы не называете свой модуль и работаете с тем же именем!
Крис Хант
2
Просто повторяю комментарий выше от Криса Ханта. Также не называйте свой модуль "Regex". Думал, что на какое-то время я схожу с ума, так как функция не работает из-за ошибки #NAME
Chris
Ну, я сошел с ума, когда попробовал все (включая изменение модулей / имен) и все еще получаю ошибку #NAME> _> i.imgur.com/UUQ6eCi.png
Enissay
@ Enissay: попробуйте создать минимальный Function foo() As Variant \n foo="Hello World" \n End FunctionUDF, чтобы увидеть, работает ли это. Если да, переходите к полному описанному выше, если ничего не нарушено (макросы отключены?).
Патрик Бёкер
1
@Vijay: то же самое на github.com/malcolmp/excel-regular-expressions
Вадим
64

Расширение на patszim «s ответ для тех , кто в спешке.

  1. Откройте книгу Excel.
  2. Alt+ F11открыть окно VBA / Macros.
  3. Добавьте ссылку на регулярное выражение в Инструменты, затем Ссылки
    ! [Excel VBA Form добавить ссылки
  4. и выбрав Microsoft VBScript Regular Expression 5.5
    ! [Excel VBA добавить ссылку на регулярное выражение
  5. Вставьте новый модуль (код должен находиться в модуле, иначе он не будет работать).
    ! [Excel VBA вставить кодовый модуль
  6. Во вновь вставленном модуле
    ! [Excel VBA вставить код в модуль
  7. добавьте следующий код:

    Function RegxFunc(strInput As String, regexPattern As String) As String
        Dim regEx As New RegExp
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = regexPattern
        End With
    
        If regEx.Test(strInput) Then
            Set matches = regEx.Execute(strInput)
            RegxFunc = matches(0).Value
        Else
            RegxFunc = "not matched"
        End If
    End Function
  8. Шаблон регулярного выражения помещается в одну из ячеек, и для него используется абсолютная ссылка . ! [Использование функции регулярного выражения Excel в ячейке Функция будет привязана к книге, в которой она создана.
    Если необходимо использовать ее в разных книгах, сохраните функцию в Personal.XLSB.

Сэм
источник
1
Спасибо, что упомянули, что он должен быть в Personal.xlsb, чтобы быть доступным во всех документах Excel, над которыми вы работаете. В большинстве (?) Других ответов это не ясно. Personal.XLSB будет находиться в папке (возможно, потребуется создать папку) C: \ Users \ имя пользователя \ AppData \ Local \ Microsoft \ Excel \ XLStart папка
Марк Стюарт
26

Вот моя попытка:

Function RegParse(ByVal pattern As String, ByVal html As String)
    Dim regex   As RegExp
    Set regex = New RegExp

    With regex
        .IgnoreCase = True  'ignoring cases while regex engine performs the search.
        .pattern = pattern  'declaring regex pattern.
        .Global = False     'restricting regex to find only first match.

        If .Test(html) Then         'Testing if the pattern matches or not
            mStr = .Execute(html)(0)        '.Execute(html)(0) will provide the String which matches with Regex
            RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
        Else
            RegParse = "#N/A"
        End If

    End With
End Function
Викас Гаутам
источник
9

Мне нужно было использовать это как функцию ячейки (например, SUMили VLOOKUP) и я обнаружил, что это легко:

  1. Убедитесь, что вы находитесь в файле Excel с поддержкой макросов (сохраните как xlsm).
  2. Открытые инструменты разработчика Alt +F11
  3. Добавьте Microsoft VBScript Regular Expressions 5.5, как в других ответах
  4. Создайте следующую функцию в рабочей книге или в своем собственном модуле:

    Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant
        Dim regex As New VBScript_RegExp_55.RegExp
        Dim strInput As String
    
        strInput = myRange.Value
    
        With regex
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
    
        REGPLACE = regex.Replace(strInput, outputPattern)
    
    End Function
  5. Затем вы можете использовать в ячейке с =REGPLACE(B1, "(\w) (\d+)", "$1$2")(например: "A 243" до "A243")

DeezCashews
источник
Это наименование outputPattern отбросило меня. Это восстановительная стоимость.
Тор
1
Да. Полагаю, я оставил его с именем pattern, чтобы было ясно, что это не просто подстановка строк, и вы можете использовать группы сопоставления регулярных выражений, такие как $ 1 $ 2 и т. Д.
DeezCashews
7

Это не прямой ответ, но может предоставить более эффективную альтернативу для вашего рассмотрения. Это то, что Google Sheets имеет несколько встроенных функций регулярных выражений это может быть очень удобно и поможет обойти некоторые технические процедуры в Excel. Очевидно, что использование Excel на вашем компьютере имеет некоторые преимущества, но для подавляющего большинства пользователей Google Sheets предлагает идентичные возможности и может предложить некоторые преимущества в переносимости и совместном использовании документов.

Они предлагают

REGEXEXTRACT: извлекает соответствующие подстроки в соответствии с регулярным выражением.

REGEXREPLACE: заменяет часть текстовой строки другой текстовой строкой с использованием регулярных выражений.

ЗАМЕНА: заменяет существующий текст новым текстом в строке.

REPLACE: заменяет часть текстовой строки другой текстовой строкой.

Вы можете напечатать их прямо в ячейку, и вы получите все, что захотите.

=REGEXMATCH(A2, "[0-9]+")

Они также довольно хорошо работают в сочетании с другими функциями, такими как операторы IF, например:

=IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")

введите описание изображения здесь

Надеемся, что это обеспечивает простой обходной путь для пользователей, которые чувствуют насмешки в компоненте VBS Excel.

Алекс Розеланд
источник
Спасибо, что поделился Алекс. Это полезно для тех, кто ищет версию Google. Вы можете написать и ответить на другой вопрос, специфичный для Google Sheets Regex, поскольку он имеет собственную номенклатуру и будет очень полезен для других. В любом случае, у тебя есть мой голос!
Портлендский Бегун
4

Вот regex_subst()функция. Примеры:

=regex_subst("watermellon", "[aeiou]", "")
---> wtrmlln
=regex_subst("watermellon", "[^aeiou]", "")
---> aeeo

Вот упрощенный код (проще для меня, во всяком случае). Я не мог понять, как построить подходящий шаблон вывода, используя приведенное выше, чтобы работать как мои примеры:

Function regex_subst( _
     strInput As String _
   , matchPattern As String _
   , Optional ByVal replacePattern As String = "" _
) As Variant
    Dim inputRegexObj As New VBScript_RegExp_55.RegExp

    With inputRegexObj
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = matchPattern
    End With

    regex_subst = inputRegexObj.Replace(strInput, replacePattern)
End Function
jgreve
источник
1

Я не хочу включать справочную библиотеку, так как мне нужно, чтобы мои сценарии были переносимыми. Dim foo As New VBScript_RegExp_55.RegExpЛиния вызвалаUser Defined Type Not Defined ошибки, но я нашел решение , которое работало для меня.

Что вы хотите сделать, это поместить пример строки в ячейку A1, а затем проверить свои strPattern. Как только это работает, отрегулируйте тогда rngкак желаемый.

Public Sub RegExSearch()
'/programming/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops
'https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
'https://www.vitoshacademy.com/vba-regex-in-excel/
    Dim regexp As Object
    'Dim regex As New VBScript_RegExp_55.regexp 'Caused "User Defined Type Not Defined" Error
    Dim rng As Range, rcell As Range
    Dim strInput As String, strPattern As String

    Set regexp = CreateObject("vbscript.regexp")
    Set rng = ActiveSheet.Range("A1:A1")

    strPattern = "([a-z]{2})([0-9]{8})"
    'Search for 2 Letters then 8 Digits Eg: XY12345678 = Matched

    With regexp
        .Global = False
        .MultiLine = False
        .ignoreCase = True
        .Pattern = strPattern
    End With

    For Each rcell In rng.Cells

        If strPattern <> "" Then
            strInput = rcell.Value

            If regexp.test(strInput) Then
                MsgBox rcell & " Matched in Cell " & rcell.Address
            Else
                MsgBox "No Matches!"
            End If
        End If
    Next
End Sub
FreeSoftwareServers
источник
Я не хочу включать эталонную библиотеку, так как мне нужно, чтобы мои сценарии были переносимыми - VBScript_RegExp_55библиотека в значительной степени повсеместна, поэтому имеет очень низкий риск не оказаться на конкретной целевой машине. И в любом случае, переключение с раннего связывания на позднее связывание не решает проблему переносимости (код все равно будет
давать
1
Нет, это совсем не так, этот сценарий может быть передан другому пользователю без включения чего-либо переносимого. Спасибо, что
FreeSoftwareServers
1
Конечно, но код RegEx не будет использоваться . Если материал RegEx является частью большой книги библиотеки, я думаю, что он не вызовет ошибку компиляции, поэтому можно использовать другие части как полезные
chris neilsen
1

Чтобы добавить к ценному контенту, я хотел бы создать это напоминание о том, почему иногда RegEx в VBA не идеальны. Не все выражения поддерживаются, но вместо этого могут бросить Error 5017и могут оставить автора угадывать (что я жертва себя).

В то время как мы можем найти некоторые источники о том, что это поддерживается, было бы полезно знать , какие метасимволы т.д., не поддерживаются. Более подробное объяснение можно найти здесь . Упоминается в этом источнике:

«Хотя» регулярное выражение VBScript ... версия 5.5 реализует довольно много существенных функций регулярных выражений, которые отсутствовали в предыдущих версиях VBScript. ... JavaScript и VBScript реализуют регулярные выражения в стиле Perl. Однако им не хватает целого ряда расширенных функций, доступных в Perl и других современных разновидностях регулярных выражений: "


Итак, не поддерживаются:

  • Start of String ancor \A, альтернативно используйте ^каретку, чтобы соответствовать положению перед первым символом в строке
  • End of String ancor \Z, альтернативно используйте $знак доллара, чтобы соответствовать положению после последнего символа в строке
  • Позитивное назад ' , например: (?<=a)b( в то время как Postive LookAhead это поддерживается)
  • Отрицательная назад ' , например: (?<!a)b( в то время как отрицательное LookAhead будет поддерживается)
  • Атомная группировка
  • Притяжательные квантификаторы
  • Unicode например: \{uFFFF}
  • Именованные группы захвата . В качестве альтернативы используйте пронумерованные группы захвата
  • Встроенные модификаторы, например: /i(чувствительность к регистру) или /g(глобальный) и т. Д. Установите их через RegExpсвойства объекта> RegExp.Global = Trueи, RegExp.IgnoreCase = Trueесли доступно.
  • Conditionals
  • Комментарии к регулярным выражениям . Добавьте это с регулярными 'комментариями в сценарии

Я уже несколько раз ударил стену, используя регулярные выражения в VBA. Обычно с, LookBehindно иногда я даже забываю модификаторы. Я не испытывал все эти вышеупомянутые фоны самостоятельно, но думал, что я постараюсь быть обширным, обращаясь к некоторой более глубокой информации. Не стесняйтесь комментировать / исправить / добавить. Большой привет регулярным-expression.info для богатства информации.

PS Вы упомянули обычные методы и функции VBA, и я могу подтвердить, что они (по крайней мере, для меня) по-своему помогли, когда RegEx потерпит неудачу.

JvdV
источник