Vb6 用字符串分割字符串?

Vb6 用字符串分割字符串?,vb6,split,Vb6,Split,如果我有一个字符串,比如: Dim someStr As String someStr = "NODE TEST ACCESS" 我想把那个字符串分成两个空格。它看起来像是Split() 用字符串(本例中为两个空格)拆分字符串最简单的方法是什么?用两个或两个以上的空格分割就可以了。我不希望拆分为正好两个字符。如果不需要保留空格,可以尝试使用replace命令将每两个字符替换为可以拆分的单个字符 Dim someStr As String Dim someArray()

如果我有一个字符串,比如:

Dim someStr As String
someStr = "NODE TEST              ACCESS"
我想把那个字符串分成两个空格。它看起来像是
Split()


用字符串(本例中为两个空格)拆分字符串最简单的方法是什么?用两个或两个以上的空格分割就可以了。我不希望拆分为正好两个字符。

如果不需要保留空格,可以尝试使用replace命令将每两个字符替换为可以拆分的单个字符

Dim someStr As String
Dim someArray() as String

someStr = "NODE TEST              ACCESS"
someArray = split(Replace$(someStr,"  ","|"),"|")

如果不需要保留空格,可以尝试使用replace命令将每两个字符替换为可以拆分的单个字符

Dim someStr As String
Dim someArray() as String

someStr = "NODE TEST              ACCESS"
someArray = split(Replace$(someStr,"  ","|"),"|")

好的,在对OP的需求进行了一些澄清之后,我们需要对lardymonkey的想法进行一些补充。因此:

Dim someStr As String
Dim someArray() as String
Dim cLen As Integer 'Keep a count of the current characters in the string

someStr = "NODE TEST              ACCESS"

'Strip off one space at a time from groups of >2 spaces
Do
    cLen = Len(someStr)
    someStr = Replace(someStr, Space$(3), Space$(2)) 
Loop Until cLen = Len(someStr) 'No more replacements were made in the current iteration

'Now you can use lardymonkey's idea
someArray = Split(Replace$(someStr,"  ","|"),"|")

好的,在对OP的需求进行了一些澄清之后,我们需要对lardymonkey的想法进行一些补充。因此:

Dim someStr As String
Dim someArray() as String
Dim cLen As Integer 'Keep a count of the current characters in the string

someStr = "NODE TEST              ACCESS"

'Strip off one space at a time from groups of >2 spaces
Do
    cLen = Len(someStr)
    someStr = Replace(someStr, Space$(3), Space$(2)) 
Loop Until cLen = Len(someStr) 'No more replacements were made in the current iteration

'Now you can use lardymonkey's idea
someArray = Split(Replace$(someStr,"  ","|"),"|")

对lardymonkey和Bobrodes的回答有一点变化

为什么要将空格替换为“|”?原始字符串本身可能包含“|”,这将产生意外的结果

最好将双空格替换为单空格:

Private Sub Command1_Click()
  Dim someStr As String
  Dim strArray() As String
  someStr = "NODE TEST              ACCESS"
  someStr = RemoveDouble(someStr, " ")
  strArray = Split(someStr, " ")
End Sub

Private Function RemoveDouble(strSource As String, strRemove As String)
  Dim strReturn As String
  Dim strDouble As String
  strDouble = strRemove & strRemove
  strReturn = Replace(strSource, strDouble, strRemove)
  Do While InStr(strReturn, strDouble) > 0
    strReturn = Replace(strReturn, strDouble, strRemove)
  Loop
  RemoveDouble = strReturn
End Function

对lardymonkey和Bobrodes的回答有一点变化

为什么要将空格替换为“|”?原始字符串本身可能包含“|”,这将产生意外的结果

最好将双空格替换为单空格:

Private Sub Command1_Click()
  Dim someStr As String
  Dim strArray() As String
  someStr = "NODE TEST              ACCESS"
  someStr = RemoveDouble(someStr, " ")
  strArray = Split(someStr, " ")
End Sub

Private Function RemoveDouble(strSource As String, strRemove As String)
  Dim strReturn As String
  Dim strDouble As String
  strDouble = strRemove & strRemove
  strReturn = Replace(strSource, strDouble, strRemove)
  Do While InStr(strReturn, strDouble) > 0
    strReturn = Replace(strReturn, strDouble, strRemove)
  Loop
  RemoveDouble = strReturn
End Function

如果我正确读取OP的qusetion,他们希望拆分字符串,而不会在返回中得到空结果。使用正则表达式大大简化了这一过程。首先添加对Microsoft VBScript正则表达式5.5的引用。然后,您可以根据您的具体需要调整以下功能

注意,本例中没有错误处理

要使用该功能,请在表单中添加多行文本框和命令按钮,并粘贴以下代码

Private Sub Command1_Click()
    Dim aryMatches() As String
    Dim i As Integer
    Dim strPattern As String
    Dim strText As String

    Text1.Text = ""
    strPattern = "\w+"
    strText = "NODE TEST              ACCESS"
    If SplitString(strPattern, strText, aryMatches) > 0 Then
        For i = LBound(aryMatches) To UBound(aryMatches)
            Text1.SelText = aryMatches(i) & vbCrLf
            Text1.SelStart = Len(Text1.Text)
        Next i
    End If

End Sub

如果我正确读取OP的qusetion,他们希望拆分字符串,而不会在返回中得到空结果。使用正则表达式大大简化了这一过程。首先添加对Microsoft VBScript正则表达式5.5的引用。然后,您可以根据您的具体需要调整以下功能

注意,本例中没有错误处理

要使用该功能,请在表单中添加多行文本框和命令按钮,并粘贴以下代码

Private Sub Command1_Click()
    Dim aryMatches() As String
    Dim i As Integer
    Dim strPattern As String
    Dim strText As String

    Text1.Text = ""
    strPattern = "\w+"
    strText = "NODE TEST              ACCESS"
    If SplitString(strPattern, strText, aryMatches) > 0 Then
        For i = LBound(aryMatches) To UBound(aryMatches)
            Text1.SelText = aryMatches(i) & vbCrLf
            Text1.SelStart = Len(Text1.Text)
        Next i
    End If

End Sub

这一次,一个完全不同的答案-使用更“原始”的VB字符串函数。如果你对这些东西感兴趣,这大概是鲍勃·罗德回答的两倍

基本上,我在字符串中移动,注意两个或多个空格的位置,然后一次移动一个字符,直到找到一个非空格。使用此信息,我们可以从字符串中的正确位置拉出子字符串,并将它们复制到预先分配的字符串数组中。我将数组分配为64块。如果我们超过数组中的元素数,我们会将其重新分配64个块

Private Function SplitOnMultiSpaces2(ByVal someStr As String) As String()

    Const someStringsChunkLen   As Long = 64
    Dim someStringLen           As Long
    Dim someStrings()           As String
    Dim someStringsIndex        As Long
    Dim multiSpacePos           As Long
    Dim nextPos                 As Long

    ' Cache the length of the string.
    someStringLen = Len(someStr)

    ' Allocate one chunk of elements initially.
    ReDim someStrings(0 To someStringsChunkLen - 1)

    ' Point to the first element in the array.
    someStringsIndex = 0

    ' Find the first position of more than 1 space.
    multiSpacePos = InStr(1, someStr, "  ", vbBinaryCompare)

    ' Special case. If no multi spaces were found, then simply return a single string in the array.
    If multiSpacePos = 0 Then
        someStrings(0) = someStr
    Else
        ' Point the beginning of the next string to the first character in <someStr>.
        nextPos = 1
        Do
            ' Copy the "next string" into the next available array element.
            someStrings(someStringsIndex) = Mid$(someStr, nextPos, multiSpacePos - nextPos)

            ' Move to the second space in the multi-spaces, and iterate until we find a non-space (space = ASCII 32).
            nextPos = multiSpacePos + 1
            Do
                If nextPos = someStringLen Then
                    Exit Do
                End If
                nextPos = nextPos + 1
            Loop While AscW(Mid$(someStr, nextPos, 1)) = 32

            ' We now pointing to the beginning of the next string - or at the end of the string.
            ' Look for the next multi space.
            multiSpacePos = InStr(nextPos, someStr, "  ", vbBinaryCompare)

            ' Point to the next array element.
            someStringsIndex = someStringsIndex + 1
            ' If this array element points beyond the current upper bound of the array, then add another chunk to the array.
            ' We look at the remainder from dividing <someStringsIndex> by <someStringsChunkLen>.
            ' For instance, if this is element 64, then this is 64 / 64 = 1 remainder 0.
            ' We can use this simple test because we only resize upwards.
            If (someStringsIndex Mod someStringsChunkLen) = 0 Then
                ' e.g. resize upper bound to 64 + 64 - 1 = 127.
                ReDim Preserve someStrings(0 To someStringsIndex + someStringsChunkLen - 1)
            End If
        Loop Until multiSpacePos = 0

        ' If we aren't at the end of the string, then copy the remaining values.
        If nextPos <> someStringLen Then
            someStrings(someStringsIndex) = Mid$(someStr, nextPos)
        End If
    End If

    ' Resize down to the proper size.
    ReDim Preserve someStrings(0 To someStringsIndex)

    ' Return the string array.
    SplitOnMultiSpaces2 = someStrings()

End Function
Private函数SplitOnMultiSpaces2(ByVal-someStr作为字符串)作为字符串()
Const someStringsChunkLen的长度=64
暗淡的某物和它一样长
Dim someStrings()作为字符串
模糊的某些字符串与索引一样长
暗淡的多空间位置,如长
暗淡的下一个时间尽可能长
'缓存字符串的长度。
someStringLen=Len(someStr)
'最初分配一个元素块。
ReDim someStrings(0到someStringsChunkLen-1)
'指向数组中的第一个元素。
someStringsIndex=0
'查找多于1个空格的第一个位置。
multiSpacePos=InStr(1,someStr,“,vbBinaryCompare)
"特例"。如果没有找到多个空格,只需在数组中返回单个字符串即可。
如果multiSpacePos=0,则
someStrings(0)=someStr
其他的
'将下一个字符串的开头指向中的第一个字符。
nextPos=1
做
'将“下一个字符串”复制到下一个可用数组元素中。
someStrings(someStringsIndex)=Mid$(someStr、nextPos、multiSpacePos-nextPos)
'移动到多个空间中的第二个空间,并进行迭代,直到找到一个非空间(空间=ASCII 32)。
nextPos=多空间POS+1
做
如果nextPos=someStringLen,则
退出Do
如果结束
nextPos=nextPos+1
AscW时循环(Mid$(someStr,nextPos,1))=32
'我们现在指向下一个字符串的开头-或字符串的结尾。
'查找下一个多维空间。
multiSpacePos=InStr(nextPos,someStr,“,vbBinaryCompare)
'指向下一个数组元素。
someStringsIndex=someStringsIndex+1
'如果此数组元素指向数组的当前上限之外,则向数组中添加另一个块。
“我们看一下除以的余数。
'例如,如果这是元素64,则这是64/64=1,余数为0。
“我们可以使用这个简单的测试,因为我们只向上调整大小。
如果(someStringsIndex Mod someStringsChunkLen)=0,则
'例如,将上限调整为64+64-1=127。
ReDim保留某些字符串(0到someStringsIndex+someStringsChunkLen-1)
如果结束
循环直到multiSpacePos=0
'如果我们不在字符串的末尾,则复制其余的值。
如果下一步发生了什么,那么
someStrings(someStringsIndex)=Mid$(someStr,nextPos)
如果结束
如果结束
'将大小调整到适当的大小。
重拨保留某些字符串(0到someStringsIndex)
'返回字符串数组。
SplitOnMultiSpaces2=SomeString()
端函数

这次,一个完全不同的