【发布时间】:2020-06-16 19:16:22
【问题描述】:
我有数据,我需要拆分每个块,以便将每个块存储在单独的行中。整个文本看起来像:
م
مطروح
الحمام
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/,我可以像这样定义每个块的开始
\d{1,3}\n
这会突出显示每个块的开头
如何拆分和分隔每个块>>并且每个块必须在一行中?
这是整个页面的 HTML:https://pastebin.com/nu0dLvch
这是完整数据的链接:https://pastebin.com/dWcu97Wt
我会突出显示所需的部分(这些是要匹配的组)。从...开始
以...结尾
共有22个数据块(组)。
查看@Wiktor Stribiżew 在 cmets 中提供的正则表达式: https://regex101.com/r/dmCNuH/1
匹配 11 是第一个真正需要的数据(匹配组),但会截断最后一行。
在我从 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}(?:(?:\r\n|[\r\n])(?!\s*\d{1,3}\n).*)*和regExp.Multiline = True。 -
图片中的字符串是哪里来的?来自文本文件,还是来自 Excel 单元格?我问的是,由于可以使用标准 VBA 轻松完成行拆分。并将结果粘贴到 excel 中,在单独的单元格上...
-
有很多前导尾随空格。在一个区块开始后,他们会一直在第一行和第二行吗?这样,我们就可以区分块的开头和下面有数字的行。
-
@YasserKhalil 您可能希望正则表达式也停止在看起来像日期字符串的行之前,对吧?然后你需要regex101.com/r/dmCNuH/4,
^\s*\d{1,3}(?:\n(?!\s*\d{1,3}\n|\d{4}/\d{2}/\d{2}\n).*)+。如果您在 Excel 中的单元格内有换行符,则可能是 CR,因此您需要\r而不是\n。