RegEx в VB (Excel) - как это декодировать - PullRequest
0 голосов
/ 04 февраля 2019

Прочитав этот очень полезный пост о том, как использовать RegEx в MS Excel, я застрял в создании необходимого выражения для следующих сценариев - Любая помощь приветствуется.

Цель:Я хочу иметь возможность разбивать строки, как показано ниже:

Пример 1:

AB12345|AB56789x89402 ---> AB12345 AB56789 89402 (каждая изтри, которые должны храниться в разных ячейках, а общее количество подстрок заранее неизвестно, может быть от 0 до 10)

Пример 2:

#AB03925# для хранения как AB03925

Пример 3:

(ABC-SR-XYZ)|(ABC-XYZ) для хранения как ABCXYZ

Возможно ли, чтобы все вышеперечисленные примеры обрабатывались с помощью одного RegEx?

До сих пор я создал следующее, которое частично обрабатывает случаи, подобные примеру 1:

    strPattern = "(^[A-Z][A-Z][0-9]{5})([|]*[A-Z][A-Z][0-9]{5})"

    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")
        End If
    End If

Однако я все еще делаюне знаю, как избавиться от трубы (|) при печати этих двух строк отдельно.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Если вам интересно, вот решение без регулярных выражений.

Option Explicit

Private Function ConvertCustomText(InputString As String) As Variant
    Dim CharactersToReplace As Object: Set CharactersToReplace = CreateObject("Scripting.Dictionary")
    Dim Character           As Variant
    Dim HasDash             As Boolean

    With CharactersToReplace
        .Add "#", vbNullString
        .Add "(", vbNullString
        .Add ")", vbNullString
        .Add "-", vbNullString
        .Add "x", "|"
    End With

    HasDash = IIf(InStr(1, InputString, "-", vbBinaryCompare) > 0, True, False)

    For Each Character In CharactersToReplace
        InputString = Replace(InputString, Character, CharactersToReplace(Character))
    Next

    ConvertCustomText = IIf(HasDash, _
                            Split(InputString, "|")(UBound(Split(InputString, "|"))), _
                            Split(InputString, "|"))
End Function

Public Sub Example()
    PrintArrayOrText (ConvertCustomText("AB12345|AB56789x89402"))
    PrintArrayOrText (ConvertCustomText("#AB03925#"))
    PrintArrayOrText (ConvertCustomText("(ABC-SR-XYZ)|(ABC-XYZ)"))
End Sub

Private Sub PrintArrayOrText(VariantInput As Variant)
    Dim i As Long

    If TypeName(VariantInput) = "String" Then
        Debug.Print "Output is " & VariantInput
    Else
        For i = LBound(VariantInput) To UBound(VariantInput)
            Debug.Print "Output is " & VariantInput(i)
        Next
    End If

End Sub

Возвращает:

Output is AB12345
Output is AB56789
Output is 89402
Output is AB03925
Output is ABCXYZ
0 голосов
/ 04 февраля 2019

Для пример 1 & 2 это регулярное выражение работает
[A-Z]{2}\d{5}|\d{5} Доказательство в регулярное выражение .
enter image description here

Чтобы получить разные результаты, вы можете использовать разные столбцы, используя столбец для установки индекса результата.

If regEx.Test(strInput) Then
    Set matches = regEx.Execute(strInput)
    Dim resultSetIndex
    resultSetIndex = Application.Caller.Column - x ' x is your first column

    If resultSetIndex < matches.Count Then
        RegxFunc = matches(resultSetIndex).Value
    Else
        RegxFunc = ""
    End If
    Else
        RegxFunc = "not matched"
End If

Application.Caller.Column используется для определения индекса результата.
Вам нужно установить x где вы размещаете столбец.В приведенном ниже примере x - это 7 .
column to result set
Для пример 3 вам необходимо более подробно изучить правило (ы)) для извлечения.
На данный момент не совсем ясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...