Як використовувати регулярні вирази (Regex) в Microsoft Excel як в клітинку, так і в циклі


592

Як я можу використовувати регулярні вирази в Excel і скористатись потужним налаштуванням подібної сітки для роботи з даними?

  • Функція в комірці для повернення відповідного шаблону або заміненого значення в рядку.
  • Надіслати цикл перегляду через стовпчик даних та витягнути збіги до сусідніх комірок.
  • Яка установка необхідна?
  • Які особливі символи Excel для регулярних виразів?

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



1
Спробуйте цю безкоштовну надбудову: seotoolsforexcel.com/regexpfind
Niels Bosma

1
Не будемо забувати Like оператора , який забезпечує своєрідну легку версію функціональних можливостей у стилі регулярних виразів. Зазвичай це набагато швидше, ніж регулярний вираз, навіть якщо він перетворений на процедуру суб або функції.
Egalth

Відповіді:


955

Для відповідності шаблонів використовуються регулярні вирази .

Для використання в Excel виконайте наступні дії:

Крок 1 : Додайте посилання VBA до "Регулярні вирази Microsoft VBScript 5.5"

  • Виберіть вкладку "Розробник" (у мене немає цієї вкладки, що робити? )
  • Виберіть піктограму "Visual Basic" у розділі стрічки "Код"
  • У вікні "Microsoft Visual Basic для додатків" виберіть "Інструменти" у верхньому меню.
  • Виберіть "Посилання"
  • Поставте прапорець біля пункту "Регулярні вирази Microsoft VBScript 5.5", який слід включити до вашої робочої книги.
  • Натисніть "ОК"

Крок 2 : Визначте свій шаблон

Основні визначення:

- Дальність.

  • Напр. a-zВідповідає малі літери від a до z
  • Наприклад, 0-5відповідає будь-якому числу від 0 до 5

[] Збіжіть точно один із об'єктів всередині цих дужок.

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

()Групуйте різні матчі для цілей повернення. Дивіться приклади нижче.

{} Множник для повторних копій шаблону, визначених перед ним.

  • Наприклад, [a]{2}збігається з двома послідовними малими літерами a:aa
  • Наприклад , [a]{1,3}відповідає принаймні , один і до три малої літери a, aa,aaa

+ Збіжіть принаймні один або більше шаблонів, визначених перед ним.

  • Наприклад a+, відповідатимуть послідовні знаки " a," aa, aaaтощо

? Зрівняти нуль або один із шаблонів, визначених перед ним.

  • Наприклад, шаблон може бути, а може бути, але він може бути узгоджений лише один раз.
  • Напр. [a-z]?Відповідає порожній рядок або будь-яка маленька літера.

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

. Відповідає будь-якому символу, крім нового рядка \n

  • Напр. 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буде повертати «Not Matched» , тому що цифри не були на початку рядка.

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. Ви отримаєте винятки з пам'яті, коли цей Sub виконується часто.
Кирило

1
Я пристосував приклад 4 з SubMatches для лікування більш складних виразів, в основному я не використовую замінити , коли розщеплення, якщо кому - то цікаво: stackoverflow.com/questions/30218413 / ...
Armfoot

11
Пізня лінія зв’язування:Set regEx = CreateObject("VBScript.RegExp")
ZygD

2
Гаразд, я впевнений, що це код ThisWorkbook. Спробуйте перемістити код до окремого Module.
Портленд Бігун

3
@PortlandRunner у "Explorer Explorer" (?) У цьому файлі excel не було підпапки "Модулі", хоча інший файл показав такий. Клацніть правою кнопкою миші файл і вибрав «Вставити модуль», потім двічі клацнув «Модуль 1» і вставив код. Збережено. Поверніться до робочої книги та знову запустили функцію - вона спрацювала. Чи може бути примітним у відповіді, заради недосвідченого, як я? Дякую за допомогу.
youcantryreachingme

205

Для використання регулярних виразів безпосередньо у формулах Excel може допомогти наступна UDF (визначена користувачем функція). Він більш-менш безпосередньо розкриває функціональність регулярного вираження як функцію excel.

Як це працює

Він займає 2-3 параметри.

  1. Текст, для якого використовується регулярний вираз.
  2. Регулярний вираз.
  3. Рядок формату, який визначає, як повинен виглядати результат. Він може містити $0, $1, $2і так далі. $0- це весь збіг, $1і вище відповідають відповідним групам матчу в регулярному виразі. За замовчуванням до $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 до бібліотеки Regular Expressions (безсоромно скопійовано з відповіді Portland Runners ++ ):
    1. Клацніть на Інструменти -> Список літератури (вибачте знімок екрана з німецької мови) Інструменти -> Список літератури
    2. Знайдіть Microsoft VBScript Regular Expressions 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
Кріс,


@Enissay: Спробуйте створити мінімальний Function foo() As Variant \n foo="Hello World" \n End FunctionUDF, щоб побачити, чи це працює. Якщо так, попрацюйте до повного, що описано вище, якщо нічого основного не порушено (макроси вимкнено?).
Патрік Бьокер


64

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

  1. Відкрити робочу книжку Excel.
  2. Alt+ F11відкрити вікно VBA / Макроси.
  3. Додайте посилання на регулярний вимір у меню Інструменти, а потім - Посилання
    ! [Форма Excel VBA додайте посилання
  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, над якими ви працюєте. Більшість (?) Інших відповідей не дають цього зрозуміти. Особистий.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 регулярні вирази 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")


Це іменування outputPattern мене відкинуло. Це значення заміщення.
Тор

1
Так. Я вважаю, що я залишив його з назвою шаблону, щоб було зрозуміло, що це не просто підміна рядків, і ви можете використовувати групи, що відповідають регулярному вираженню, наприклад, $ 1 $ 2 тощо.
DeezCashews

7

Це не пряма відповідь, але може запропонувати більш ефективну альтернативу для вашого розгляду. Що означає, що в Google Sheets є кілька вбудованих функцій Regex, це може бути дуже зручно і допомогти обійти деякі технічні процедури в Excel. Очевидно, є деякі переваги використання Excel на вашому ПК, але для більшості користувачів Google Таблиці запропонують ідентичний досвід, а також можуть запропонувати певні переваги в портативності та обміні документами.

Вони пропонують

REGEXEXTRACT: Витягує відповідні підряди згідно з регулярним виразом.

REGEXREPLACE: Замінює частину текстового рядка іншим текстовим рядком, використовуючи регулярні вирази.

SUBSTITUTE: Замінює наявний текст новим текстом у рядку.

ЗАМІНА: Замінює частину текстового рядка іншим текстовим рядком.

Ви можете ввести їх безпосередньо в клітинку так, і ви отримаєте все, що завгодно

=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

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

Мені не хочеться включати довідкову бібліотеку, оскільки мені потрібні, щоб мої сценарії були портативними - VBScript_RegExp_55бібліотека є майже всюдисущою, тому несе в собі дуже низький ризик не бути на певній цільовій машині. І все одно, перехід від Early Bound до Late Bound не вирішує проблему переносимості (код все одно буде помилкою, лише під час виконання, а не час компіляції)
chris neilsen

1
Ні, це зовсім не вірно, цим сценарієм можна ділитися з іншим користувачем, не вмикаючи нічого, що є портативним. Дякую Тхо
FreeSoftwareServers

1
Звичайно, але код RegEx не буде корисним . Якщо речі з RegEx є частиною більшої робочої книги бібліотеки, я думаю, якщо вона не
видає

1

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

У той час як ми можемо знайти деякі джерела про те, що це підтримується, було б корисно знати , які метасимволу т.д., НЕ підтримуються. Більш поглиблене пояснення можна знайти тут . Згадано в цьому джерелі:

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


Отже, не підтримуються такі:

  • Початок стринкового якоря \A, альтернативно використовуйте каре , ^щоб відповідати позиції перед першим знаком у рядку
  • Кінець рядкового якоря \Z, альтернативно, використовуйте $знак долара, щоб відповідати позиції після останнього знаку в рядку
  • Позитивне назад ' , наприклад: (?<=a)b( в той час як Postive LookAhead це підтримується)
  • Негативна назад ' , наприклад: (?<!a)b( в той час як негативне LookAhead буде підтримується)
  • Атомне групування
  • Посильні квантори
  • Unicode, наприклад: \{uFFFF}
  • Названі групи захоплення . В якості альтернативи можна використовувати пронумеровані групи захоплення
  • Вбудовані модифікатори, наприклад: /i(чутливість до регістру) або /g(глобальна) тощо. Встановіть їх за допомогою RegExpвластивостей об'єкта> RegExp.Global = Trueі, RegExp.IgnoreCase = Trueякщо вони доступні.
  • Умовні умови
  • Коментарі регулярних виразів . Додайте їх за допомогою регулярних 'коментарів у сценарії

Я вже не раз бився об стіну, використовуючи регулярні вирази в межах VBA. Зазвичай, LookBehindале іноді я навіть забуваю модифікатори. Я не переживав усіх цих вищезазначених фонів самостійно, але думав, що намагаюся бути детальним, посилаючись на ще більш глибоку інформацію. Не соромтеся коментувати / виправляти / додавати. Великий вигук на регулярні експреси.info для отримання великої кількості інформації.

PS Ви згадали про регулярні методи та функції VBA, і я можу підтвердити, що вони (принаймні для себе) були корисними по-своєму, коли RegEx не зможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.