VBA Извлечь электронные письма из ячейки [duplicate]

Этого еще не нужно, но когда я использовал консольное приложение для быстрых тестов и требуемого async, я просто решил его следующим образом:

class Program
{
    static void Main(string[] args)
    {
        MainAsync(args).Wait();
    }

    static async Task MainAsync(string[] args)
    {
        // Code here
    }
}
413
задан ashleedawg 27 June 2018 в 16:26
поделиться

4 ответа

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

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

Шаг 1: добавьте ссылку VBA на «Microsoft VBScript Regular Expressions 5.5»

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

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

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

- Диапазон.

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

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

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

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

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

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

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

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

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

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

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

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

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

| OR operator

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

^ Оператор NOT

  • Например. Символ [^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».

enter image description here [/g9]


Пример 3: Loop Through Range

Этот пример аналогичен примеру 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 & amp; 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

Результаты:

enter image description here [/g10]


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

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 preceeding 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
709
ответ дан wesanyer 16 August 2018 в 00:01
поделиться
  • 1
    Я думаю, вы должны добавить больше подробностей к этому ответу. – Jean-François Corbett 3 March 2015 в 16:18
  • 2
    Вы не должны забывать Set regEx = Nothing. Вы получите исключения из памяти, если этот Sub выполняется достаточно часто. – Kiril 13 March 2015 в 11:28
  • 3
    Yay, теперь вы можете написать парсер HTML в VBA6, используя регулярные выражения! – Archimaredes 2 December 2015 в 17:40
  • 4
    Поздняя строка привязки: Set regEx = CreateObject("VBScript.RegExp") – ZygD 5 December 2015 в 12:23
  • 5
    thx для ответа. как насчет попытки получить группу из регулярного выражения? – BKSpurgeon 21 May 2016 в 05:54

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

  1. Убедитесь, что вы находитесь в файле макросов с поддержкой макроса (save as 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»)
15
ответ дан Lonely Neuron 16 August 2018 в 00:01
поделиться
  • 1
    Это обозначение outputPattern отбросило меня. Это значение замены. – Thor 1 June 2017 в 17:47
  • 2
    Да. Я полагаю, я оставил его с именем pattern, поэтому было ясно, что это была не просто подстановка строк, и вы могли бы использовать регулярные выражения, такие как $ 1 $ 2 и т. Д. – DeezCashews 1 June 2017 в 17:50

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

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

Он принимает 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 ++ answer ): нажмите Инструменты -> Ссылки (пожалуйста, извините немецкий скриншот) Tools -> References [/g14] Найдите Microsoft VBScript Regular Expressions 5.5 в списке и поставьте галочку рядом с Это. Нажмите OK .
  3. Нажмите Insert Module . Если вы присвоите модулю другое имя, убедитесь, что модуль не имеет то же имя, что и UDF ниже (например, имя модуля Regex, а функция regex вызывает #NAME! ). Second icon in the icon row -> Module [/g15]
  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 для приложений Окно редактора.
155
ответ дан Patrick Böker 16 August 2018 в 00:01
поделиться
  • 1
    Спасибо за этот ответ. Это намного чище, чем принятый ответ выше. – MgSam 23 February 2015 в 19:32
  • 2
    Этот ответ в сочетании с шагами здесь для создания надстройки был очень полезным. Спасибо. Убедитесь, что вы не предоставляете свой модуль и не используете одно и то же имя! – Chris Hunt 24 February 2015 в 20:03
  • 3
    ИМХО. Оба ответа хороши: сначала ссылка на regexp, вторая дает инструмент :). – Willmore 17 June 2015 в 11:47
  • 4
    Просто повторю комментарий выше от Криса Ханта. Не называйте свой модуль «Regex». Думал, что я немного схожу с ума, так как функция не будет работать из-за ошибки #NAME – Chris 28 September 2015 в 14:57
  • 5
    Ну, я с ума сходил, когда я пробовал все (включая изменение модулей / имен) и все еще получал ошибку #NAME & gt; _ & gt; i.imgur.com/UUQ6eCi.png – Enissay 15 August 2016 в 20:46

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

  1. Откройте книгу Excel.
  2. Alt + F11, чтобы открыть окно VBA / Macros.
  3. Добавить ссылку на регулярное выражение в Инструменты , затем Ссылки
  4. и выбирая Microsoft VBScript Regular Expression 5.5
  5. Вставьте новый модуль (код должен находиться в модуле, иначе он не будет работать).
  6. Во вновь вставленном модуле
  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. шаблон регулярного выражения помещается в одну из ячеек, а используется абсолютная ссылка . Функция будет привязана к рабочей книге, которую она создала. Если есть необходимость, чтобы она использовалась в разных книгах, сохраните эту функцию в Personal.XLSB
31
ответ дан Community 16 August 2018 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: