将一组双引号划界名称值对分为数组的最简单方法是什么



给定一个包含的字符串:

property myprop1="test" myprop2="testing again" myprop3="another test"

进入字符串数组的最简单方法是什么:

property
myprop1="test"
myprop2="testing again"
myprop3="another test"

分为2维数阵列会更好:

property
myprop1     test
myprop2     testing again
myprop3     another test

我的最初计划是在字符串上使用空格定界符运行拆分功能。如果在名称值对的值部分中没有嵌入的空间,则可以使用,这(当然)确实包含空格。

一些条件:此代码需要在Excel 2010 VBA中执行。我不想添加第三方参考或一堆工具包。我不是在寻找优雅或IEEE示例。我需要可维护和可理解的生产代码。

事先感谢您的所有帮助!

编辑:" mypropx"的数量是可变的;可能有较少或超过三个。EDIT2:我被告知另一个"差异"。:)事实证明,MyProp的价值可能不会被双引号界定;在这种情况下,它将是一个没有内部空间的单个字母字符串。

尝试此

Sub Test()
    Dim strVar, Arr1, Arr2()
    strVar = "property myprop1=""test"" myprop2=""testing again"" myprop3=""another test"""
    Arr1 = Split(Mid(strVar, InStr(1, strVar, " ") + 1), """ ")
    ReDim Arr2(UBound(Arr1) + 1)
    Arr2(0) = Mid(strVar, 1, InStr(1, strVar, " ")) 'store the first string, i.e. property
    'store the data with double quotes
    For i = 0 To UBound(Arr1) - 1
        Arr2(i + 1) = Arr1(i) & """"
    Next
    'store the last string
    Arr2(i + 1) = Arr1(i)
    For i = 0 To UBound(Arr2)
        MsgBox Arr2(i)
    Next
End Sub

如果您替换('="','='),则可以在''''''上进行拆分,这应该给您:

property
myprop1=test
myprop2=testing again
myprop3=another test

这假定没有"引号"(无论如何都会使大多数试图解析)。

然后,您可以在'='上将项目分开,以进入2个元素数组。要考虑可能=在值之内设置split()上的限制参数为2。

编辑:我感到很慷慨 - 这里有一些代码 - 添加您自己的错误处理!

Public Sub ParseNVPs(ByVal str As String, ByRef ReturnArray() as String)
Dim SplitArray() As String
Dim LineArray() As String
Dim i As Integer
    str = Replace(str, "=""", "=")
    SplitArray = Split(str, """ ")
    ReDim ReturnArray(UBound(SplitArray), 1)
    For i = 0 To UBound(SplitArray)
        LineArray = Split(SplitArray(i), "=", 2)
        ReturnArray(i, 0) = LineArray(0)
        ReturnArray(i, 1) = LineArray(1)
    Next i
End Sub

这是我想到的。它不是优雅的,但可以完成工作。感谢您的输入人,这非常有帮助。

'split name value pairs into array
strWorkString = schematicLines(lngValuePosition)
lngStartPosition = 1
lngEndPosition = 1
fStartQuote = False
f1stWordDone = False
ReDim strWorkArray(0) As String
For lngLoopCounter = 1 To Len(strWorkString) - 1
    strCurrentCharacter = Mid(strWorkString, lngLoopCounter, 1)
    Select Case True
        Case (strCurrentCharacter = " " And Not fStartQuote)   'space and we aren't in a value
            If (f1stWordDone) Then
                ReDim Preserve strWorkArray(UBound(strWorkArray) + 1) As String
            End If
            lngEndPosition = lngLoopCounter
            strWorkArray(UBound(strWorkArray)) = Trim(Mid(strWorkString, lngStartPosition, lngEndPosition - lngStartPosition))
            lngStartPosition = lngEndPosition + 1
            lngEndPosition = lngStartPosition
            f1stWordDone = True
        Case strCurrentCharacter = Chr$(34) 'double quote
            If fStartQuote Then   'in a value
                'store the nvp
                lngEndPosition = lngLoopCounter
                ReDim Preserve strWorkArray(UBound(strWorkArray) + 1) As String
                strWorkArray(UBound(strWorkArray)) = Trim(Mid(strWorkString, lngStartPosition, lngEndPosition - lngStartPosition + 1))
                lngLoopCounter = lngLoopCounter + 1 'skip the space
                lngStartPosition = lngLoopCounter
                lngEndPosition = lngStartPosition
                fStartQuote = False
            Else
                fStartQuote = True
            End If
    End Select
Next lngLoopCounter
' get the last nvp
ReDim Preserve strWorkArray(UBound(strWorkArray) + 1) As String
strWorkArray(UBound(strWorkArray)) = Mid(strWorkString, lngStartPosition, lngLoopCounter - lngStartPosition + 1)

最新更新