gpt4 book ai didi

regex - 在 VBA 中使用正则表达式拆分块

转载 作者:行者123 更新时间:2023-12-04 21:47:05 32 4
gpt4 key购买 nike

我有数据,我需要拆分每个 block ,以便将每个 block 存储在单独的行中。整个文本如下所示:

م
مطروح
الحمام
school
الصف
:
الصف الأول
1
458316219
30709101600371
ابراهيم وليد ابراهيم ابوالحمد
منافذ فورى
2
458361688
30702263300318
احمد ابوالريش فرج عبدالله
منافذ فورى
3
458312720
30703143300418
اسلام فتحى محمد ناجى
منافذ فورى
4
458790904
30606101802299
اسلام نصار حسين نصار حسين عبد الونيس
منافذ فورى
5
458312908
30612013300259
ايمن راضى صالح سلومه
منافذ فورى
6
458884564
30802203300186
بسمه محمد ابراهيم ظدم
منافذ فورى
7
477625786
30708263300235
بشار نصر الله مصوف السايب
منافذ فورى

我使用了 https://regex101.com/,我可以像这样定义每个 block 的开始
\d{1,3}\n

这突出了每个 block 的开始

如何拆分和分隔每个 block >>并且每个 block 必须在一行中?

这是整个页面的 HTML: https://pastebin.com/nu0dLvch

这是完整数据的链接: https://pastebin.com/dWcu97Wt

我会突出显示所需的部分(这些是要匹配的组)。从...开始...



以...结尾



总共有22个数据 block (组)。

查看@Wiktor Stribiżew 在评论中提供的正则表达式:
https://regex101.com/r/dmCNuH/1

match 11 是第一个真正需要的数据(匹配组),但会截断最后一行。

enter image description here

在我从 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

但这对我不起作用并引发错误。

最佳答案

您可以使用

^\s*\d{1,3}(?:\n(?!\s*\d{1,3}\n).*){4}

regex demo .与 .Global = True 一起使用和 .MultiLine = True选项,无需设置 .IgnoreCaseTrue .

注意 : 自 \r ,回车,在 Excel 单元格值中用于定义换行符,您可能需要全部替换 \n带有 \r 的模式中的字符.

正则表达式匹配可能缩进或不缩进并包含 1、2 或 3 位数字的行,然后抓取与初始模式不匹配的接下来的四行。

更多详情
  • ^ - 行首
  • \s* - 0 个或多个空格字符
  • \d{1,3} - 一到三位数
  • (?:\n(?!\s*\d{1,3}\n).*){4} - 一个 non-capturing group匹配四个 ({4}) 的出现
  • \n - 换行符 ( \n ) 是...
  • (?!\s*\d{1,3}\n) - ( negative lookahead ) 没有立即跟在后面:
  • \s* - 0 个或多个空格
  • \d{1,3} - 一位、两位或三位数字
  • \n - 换行符
  • .* - 尽可能多的除换行符以外的任何 0 个或多个字符。

  • 提取组的详细信息 , 你可以使用
    ^[^\S\n]*(\d{1,3})\n\s*(\d{6,})[^\S\n]*\n\s*(\d{14})[^\S\n]*\n(.+)\n(.+)

    this regex demo
  • ^ - 字符串开头
  • [^\S\n]* - 除换行符
  • 之外的 0 个或多个空白字符
  • (\d{1,3}) - 一到三位数
  • \n - 换行符
  • \s* - 任何 0+ 个空格
  • (\d{6,}) - 第 2 组:
  • [^\S\n]*\n\s* - 除了换行符、换行符和任何 0 个或多个空格
  • 之外的 0 个或多个空格字符
  • (\d{14}) - 第 3 组:十四位数
  • [^\S\n]*\n - 除换行符和换行符之外的 0 个或多个空白字符
  • (.+) - 第 4 组:除换行符以外的任何一个或多个字符,尽可能多
  • \n - 换行符
  • (.+) - 第 5 组:除换行符以外的任何一个或多个字符,尽可能多
  • 关于regex - 在 VBA 中使用正则表达式拆分块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62342267/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com