Regex 在VBA中使用正则表达式分割块

Regex 在VBA中使用正则表达式分割块,regex,excel,vba,Regex,Excel,Vba,我有数据,我需要分割每个块,以便将每个块存储在单独的行中。全文如下: م مطروح الحمام school الصف : الصف الأول 1 458316219 30709101600371 ابراهيم وليد ابراهيم ابوالحمد منافذ فورى 2 458361688 30702263300318 احمد ابوالريش فرج عبدالله منافذ فورى 3 458312720 30703143300418 ا

我有数据,我需要分割每个块,以便将每个块存储在单独的行中。全文如下:

م
مطروح
الحمام
school
الصف
:
الصف الأول
 1
 458316219 
 30709101600371 
ابراهيم وليد ابراهيم ابوالحمد
منافذ فورى
 2
 458361688 
 30702263300318 
احمد ابوالريش فرج عبدالله
منافذ فورى
 3
 458312720 
 30703143300418 
اسلام فتحى محمد ناجى
منافذ فورى
 4
 458790904 
 30606101802299 
اسلام نصار حسين نصار حسين عبد الونيس
منافذ فورى
 5
 458312908 
 30612013300259 
ايمن راضى صالح سلومه
منافذ فورى
 6
 458884564 
 30802203300186 
بسمه محمد ابراهيم ظدم
منافذ فورى
 7
 477625786 
 30708263300235 
بشار نصر الله مصوف السايب
منافذ فورى
我使用了,我可以这样定义每个块的开始

\d{1,3}\n
这将突出显示每个块的起点

如何拆分和分离每个块>>以及每个块必须在一行中

以下是整个页面的HTML:

以下是完整数据的链接:

我将强调所需的部分(这些是要匹配的组)。从

以…结尾

总共有22个数据块(组)

查看@Wiktor Stribiżew在评论中提供的正则表达式:

match 11是第一个真正需要的数据(match group),但截断了最后一行

在我从Wiktor那里得到了惊人的图案之后,我试着得到所有的匹配

Sub Test()
    Dim a(), s As String, i As Long, j As Long
        Dim bot As New ChromeDriver
    With bot
        .AddArgument "--headless"
        .Get "file:///C:\Sample.html"
        s = .FindElementByCss("table[id='all']").Text

    End With
        a = GetMatches(s, "^\s*\d{1,3}(?:(?:\r\n|[\r\n])(?!\s*\d{1,3}\n).*)+")
        For i = LBound(a) To UBound(a)
            Debug.Print a(i)
        Next i
End Sub

Function GetMatches(ByVal inputString As String, ByVal sPattern As String) As Variant
    Dim arrMatches(), matches As Object, iMatch As Object, s As String, i As Long
    With CreateObject("VBScript.RegExp")
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        .Pattern = sPattern
        If .Test(inputString) Then
            Set matches = .Execute(inputString)
            ReDim arrMatches(0 To matches.Count - 1)
            For Each iMatch In matches
                arrMatches(i) = iMatch.SubMatches.Item(0)
                i = i + 1
            Next iMatch
        Else
            ReDim arrMatches(0)
            arrMatches(0) = vbNullString
        End If
    End With
    GetMatches = arrMatches
End Function

但是这对我来说不起作用,并且会抛出一个错误。

非常感谢Wiktor和QHarr在这个问题上为我提供了很多帮助。我非常感谢他们的帮助。 这是最终的代码,我欢迎对代码的任何其他想法或修改

Sub Test()
    Dim x, a(1 To 1000, 1 To 5), bot As New ChromeDriver, col As Object, sInput As String, sPattern As String, i As Long, j As Long, cnt As Long
    sPattern = "^\s*\d{1,3}(?:\n(?!\s*\d{1,3}\n).*){4}"
    With bot
        .AddArgument "--headless"
        .Get "file:///C:\Sample.html"
        sInput = .FindElementByCss("table[id='all']").Text
    End With
    With CreateObject("VBScript.RegExp")
        .Global = True: .MultiLine = True: .IgnoreCase = True
        .Pattern = sPattern
        If .Test(sInput) Then
            Set col = .Execute(sInput)
            For i = 0 To col.Count - 1
                x = Split(col.Item(i), vbLf)
                cnt = cnt + 1
                For j = LBound(x) To UBound(x)
                    a(i + 1, j + 1) = Application.WorksheetFunction.Clean(Trim(x(j)))
                Next j
            Next i
        End If
    End With
    ActiveSheet.Range("A1").Resize(cnt, UBound(a, 2)).Value = a
End Sub

非常感谢Wiktor和QHarr在这个问题上对我的帮助。我非常感谢他们的帮助。 这是最终的代码,我欢迎对代码的任何其他想法或修改

Sub Test()
    Dim x, a(1 To 1000, 1 To 5), bot As New ChromeDriver, col As Object, sInput As String, sPattern As String, i As Long, j As Long, cnt As Long
    sPattern = "^\s*\d{1,3}(?:\n(?!\s*\d{1,3}\n).*){4}"
    With bot
        .AddArgument "--headless"
        .Get "file:///C:\Sample.html"
        sInput = .FindElementByCss("table[id='all']").Text
    End With
    With CreateObject("VBScript.RegExp")
        .Global = True: .MultiLine = True: .IgnoreCase = True
        .Pattern = sPattern
        If .Test(sInput) Then
            Set col = .Execute(sInput)
            For i = 0 To col.Count - 1
                x = Split(col.Item(i), vbLf)
                cnt = cnt + 1
                For j = LBound(x) To UBound(x)
                    a(i + 1, j + 1) = Application.WorksheetFunction.Clean(Trim(x(j)))
                Next j
            Next i
        End If
    End With
    ActiveSheet.Range("A1").Resize(cnt, UBound(a, 2)).Value = a
End Sub
你可以用

^\s*\d{1,3}(?:\n(?!\s*\d{1,3}\n).*){4}
^[^\S\n]*(\d{1,3})\n\s*(\d{6,})[^\S\n]*\n\s*(\d{14})[^\S\n]*\n(.+)\n(.+)
看。与
.Global=True
.MultiLine=True
选项一起使用,您不需要将
.IgnoreCase
设置为
True

注意:由于Excel单元格值中使用了回车符
\r
,用于定义换行符,因此可能需要将模式中的所有
\n
字符替换为
\r

正则表达式匹配一行,该行可以缩进,也可以不缩进,并且包含1、2或3个数字,然后获取与初始模式不匹配的下四行

更多详细信息

  • ^
    -行的开头
  • \s*
    -0个或更多空白字符
  • \d{1,3}
    -一到三位数字
  • (?:\n(?!\s*\d{1,3}\n.*){4}
    -匹配的
    • \n
      -换行符(
      \n
      ),它是
    • (?!\s*\d{1,3}\n)
      -()后面没有紧跟着:
      • \s*
        -0个或更多空格
      • \d{1,3}
        -一位、两位或三位数字
      • \n
        -换行符
    • *
      -除换行字符外的任何0个或更多字符,尽可能多
要使用组提取详细信息,可以使用

^\s*\d{1,3}(?:\n(?!\s*\d{1,3}\n).*){4}
^[^\S\n]*(\d{1,3})\n\s*(\d{6,})[^\S\n]*\n\s*(\d{14})[^\S\n]*\n(.+)\n(.+)

  • ^
    -字符串的开头
  • [^\S\n]*
    -0个或更多除换行符以外的空白字符
  • (\d{1,3})
    -一到三位数字
  • \n
    -换行符
  • \s*
    -任何0+空格
  • (\d{6,})
    -第2组:
  • [^\S\n]*\n\S*
    -0个或多个空格字符,而不是换行符、换行符,然后是任何0个或多个空格
  • (\d{14})
    -第3组:14位数字
  • [^\S\n]*\n
    -0个或更多除换行符和换行符以外的空白字符
  • (.+)
    -第4组:除换行符以外的任何一个或多个字符,尽可能多
  • \n
    -换行符
  • (.+)
    -第5组:除换行符以外的任何一个或多个字符,尽可能多
您可以使用

^\s*\d{1,3}(?:\n(?!\s*\d{1,3}\n).*){4}
^[^\S\n]*(\d{1,3})\n\s*(\d{6,})[^\S\n]*\n\s*(\d{14})[^\S\n]*\n(.+)\n(.+)
看。与
.Global=True
.MultiLine=True
选项一起使用,您不需要将
.IgnoreCase
设置为
True

注意:由于Excel单元格值中使用了回车符
\r
,用于定义换行符,因此可能需要将模式中的所有
\n
字符替换为
\r

正则表达式匹配一行,该行可以缩进,也可以不缩进,并且包含1、2或3个数字,然后获取与初始模式不匹配的下四行

更多详细信息

  • ^
    -行的开头
  • \s*
    -0个或更多空白字符
  • \d{1,3}
    -一到三位数字
  • (?:\n(?!\s*\d{1,3}\n.*){4}
    -匹配的
    • \n
      -换行符(
      \n
      ),它是
    • (?!\s*\d{1,3}\n)
      -()后面没有紧跟着:
      • \s*
        -0个或更多空格
      • \d{1,3}
        -一位、两位或三位数字
      • \n
        -换行符
    • *
      -除换行字符外的任何0个或更多字符,尽可能多
要使用组提取详细信息,可以使用

^\s*\d{1,3}(?:\n(?!\s*\d{1,3}\n).*){4}
^[^\S\n]*(\d{1,3})\n\s*(\d{6,})[^\S\n]*\n\s*(\d{14})[^\S\n]*\n(.+)\n(.+)

  • ^
    -字符串的开头
  • [^\S\n]*
    -0个或更多除换行符以外的空白字符
  • (\d{1,3})
    -一到三位数字
  • \n
    -换行符
  • \s*
    -任何0+空格
  • (\d{6,})
    -第2组:
  • [^\S\n]*\n\S*
    -0个或多个空格字符,而不是换行符、换行符,然后是任何0个或多个空格
  • (\d{14})
    -第3组:14位数字
  • [^\S\n]*\n
    -0个或更多除换行符和换行符以外的空白字符
  • (.+)
    -第4组:除换行符以外的任何一个或多个字符,尽可能多
  • \n
    -换行符
  • (.+)
    -第5组:除换行符以外的任何一个或多个字符,尽可能多
尝试
^\s*\d{1,3}(?:(?:\r\n |[\r\n])(?!\s*\d{1,3}\n)。*)*
使用
regExp.Mult