Excel VBA - удаление нескольких шаблонов регулярных выражений - PullRequest
0 голосов
/ 14 ноября 2018

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

Рассмотрим следующие данные:

(2.5.3) A. 100% продукции будет доставлено в течение 3 дней

(2.5.3) B. Возможность доставкипродукт по воздуху.

(2.5.3) C. Поддержка функции xyz

(2.5.3) D. Поставщик должен предоставить обзор сети в соответствии с предложением.

(2.5.3) E. Сеть должна позволять CustomerABC обнаруживать свои устройства.

(2.5.3) F. Использование существующей инфраструктуры CustomerABC должно быть оптимизировано.Возможности CustomerABC будут различаться.

(2.5.3) G. Опишите количество сетевых устройств, требующих запуска центра CustomerABC.

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

Function test(Txt As String) As String
Dim regEx As Object
Dim v1 As String
Dim v2 As String
Dim n As String
n = "CustomerABC"

If regEx Is Nothing Then
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Global = True
    regEx.IgnoreCase = True
End If
If Len(Txt) > 0 Then
    With regEx
    ' The 1st pattern
    .Pattern = "^\(?[0-9.]+\)?"
    'If Not .Test(Txt) Then Exit Function
    v1 = .Replace(Txt, "")
    ' The 2nd pattern
    .Pattern = n + "(\S*)?(\s+)?"
    'If Not .Test(Txt) Then Exit Function
    v2 = .Replace(v1, "")
 ' The result
   test = Application.Trim(v2)
   End With
  End If
End Function

Есть ли способ сделать это лучше, ускорить процесс и иметь переменное количество совпадений / удалений?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 ноября 2018

Как это:

Function test(Txt As String) As String
    Static regEx As Object '<< need Static here
    Dim rv As String, p, n

    n = "CustomerABC"

    If regEx Is Nothing Then
        Set regEx = CreateObject("VBScript.RegExp")
        regEx.Global = True
        regEx.IgnoreCase = True
    End If
    If Len(Txt) > 0 Then
        rv = Txt
        'looping over an array of patterns
        For Each p In Array("^\(?[0-9.]+\)?", n & "(\S*)?(\s+)?")
            With regEx
                .Pattern = p
                rv = .Replace(rv, "")
            End With
        Next p
    End If
    test = Application.Trim(rv)
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...