Как я могу разделить массив в VBA с разделителем на основе условия регулярного выражения? - PullRequest
1 голос
/ 16 октября 2019

У меня есть такой ввод:

apple, orange, (pear, banana, grape), mango 

, который я хочу разделить на:

apple
orange
(pear, banana, grape)
mango

Я не полностью понимаю регулярное выражение, но думаю, я бы использовал,(?! [^ ()] *)), который я нашел здесь - Java разбить строку на запятую (,) за исключением случаев, когда между скобками ()

Я использую VBA, поэтому если ясохраняя входные данные в массиве, я обычно делал бы:

array = Split(string, ",")

Но это привело бы к результату:

apple
orange
(pear
banana
grape)
mango

, который я не хочу.

Я почти уверен, что могу найти способ заменить (и) ничем, чтобы они исчезли из вывода, но я не знаю, как передать свою строковую логику регулярных выражений в формулу VBA.

Я думал, что-то вроде этого будет работать:

array = Split(string, ",(?![^()]*\))")

Но это не так. Я включил ссылку «Microsoft VBScript Regular Expressions 5.5», но она, похоже, не помогла.

Любой совет приветствуется.

Спасибо,

Ответы [ 2 ]

1 голос
/ 17 октября 2019

еще одна возможность из RegEx:

Function GetArray(ByVal str As String) As Variant       
    Dim s As String, v As Variant
    For Each v In Split(Replace(str & " ", ")", "("), "(")
        s = s & IIf(Right(v, 1) <> " ", "(" & v & ")", Replace(v, ",", "|"))
    Next

    GetArray = Split(Replace(WorksheetFunction.Trim(s), "| ", "|"), "|")
End Function

, которую вы можете использовать в своем основном коде, например:

    Dim myArray As Variant        
    myArray = GetArray("apple, orange, (pear, banana, grape), mango")
    Range("A1").Resize(ubound(myArray) + 1).Value = Application.Transpose(myArray)
1 голос
/ 16 октября 2019

Альтернатива RegEx:

Sub mytry()
    Dim str As String
    str = "apple, orange, (pear, banana, grape), mango "

    Dim perenSplt() As String
    perenSplt = Split(Replace(str, ")", ")("), "(")

    str = ""

    Dim i As Long
    For i = LBound(perenSplt) To UBound(perenSplt)
        If InStr(perenSplt(i), ")") Then
            perenSplt(i) = "(" & Replace(perenSplt(i), ",", "|")
        End If
        str = str & perenSplt(i)
    Next i

    Dim finalSplt() As String
    finalSplt = Split(str, ",")

    For i = LBound(finalSplt) To UBound(finalSplt)
        If InStr(str, "(") > 0 Then
            finalSplt(i) = Trim(Replace(finalSplt(i), "|", ","))
        Else
            finalSplt(i) = Trim(finalSplt(i))
        End If
    Next i

    ActiveSheet.Range("A1").Resize(,UBound(finalSplt) + 1) = finalSplt

End Sub

enter image description here

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