首页 > 解决方案 > 将字符串拆分为行时跳过括号中的单词计数,以便行具有相同数量的不在括号内的单词

问题描述

将字符串拆分为行时跳过括号中的单词计数,以便行具有相同数量的单词,这些单词不在括号内,但仍包括拆分中的括号。对于我的单元格设置,请参阅附图:

跳过计算括号中的单词

以下 UDF 函数用于将长字符串拆分为单元格“D3”中预定义的单词数行。

公共函数 SplitOnNth(ByVal inputStr$, ByVal StartPos&, ByVal NumWords&) 作为字符串

    Dim arr() As String, i As Long, newArr() As String
    arr = 拆分(inputStr)
    ReDim newArr(NumWords - 1)

    '数组是从零开始的,但你的字符串不是。减 1
    对于 i = StartPos - 1 到 StartPos + NumWords - 2
        If i > UBound(arr) Then Exit For '如果循环超过字符串中的最后一个单词,则退出

       '括号中的任何内容都应在单词计数中被跳过,但应包含在单词拆分中

        newArr(i - StartPos + 1) = arr(i)
    下一个

    SplitOnNth = 加入(newArr,“”)

结束功能

这就是我试图解决的问题。它是非常硬编码的,只适用于一行。非常感谢您的帮助,并在此先感谢您。

              '括号中的任何内容都应在单词计数中被跳过,但应包含在单词拆分中

        如果 arr(i) 像 "*(*" & "*)*" 那么
            newArr(i - StartPos + 1) = arr(i) + " " + _
                                    arr(i + 1) + " " + _
                                    arr(i + 2) + " " + _
                                    arr(i + 3) + " " + _
                                    arr(i + 4) + " "
            退出
        别的
        newArr(i - StartPos + 1) = arr(i)
        万一

        '结果在前两行是可以的,但对于其余的行不行
        '一二三四
        '(1) 五六七八

标签: excelstringuser-defined-functions

解决方案


我将使用正则表达式进行拆分,并将结果作为数组返回,您可以使用该INDEX函数返回相关行,或者将公式作为数组公式输入一系列单元格。

您将在代码中注意到两个不同的正则表达式,具体取决于您是否要将带括号的子字符串与后续或前面的字符串一起保留。

另请注意,正则表达式将处理多个带括号的顺序子字符串:

编辑:( 错误更正)

Option Explicit
Function splitOnNth(inputString As String, numWords As Long) As String()
    Dim RE As Object, MC As Object
    Dim I As Long, J As Long
    Dim strArray() As String

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = "(?:(?:\([^)]+\)\s+)+)?\S+" 'in parentheses combined with following word
    '.Pattern = "\S+(?:(?:\s+\([^)]+\))+)?" 'in_parentheses combined with preceding word

    If .test(inputString) = True Then
        Set MC = .Execute(inputString)
        ReDim strArray(1 To Int(MC.Count / numWords + 1))

        J = 1
        For I = 1 To UBound(strArray)
            For J = J To numWords * I
                If J > MC.Count Then Exit For
                strArray(I) = strArray(I) & " " & MC(J - 1)
            Next J
            strArray(I) = Mid(strArray(I), 2)
        Next I
    End If
End With

splitOnNth = strArray

End Function

在此处输入图像描述

这是对正则表达式的解释:

拆分单词,除了保留括号中的单词和后面的单词

(?:(?:\([^)]+\)\s+)+)?\S+

使用RegexBuddy创建


推荐阅读