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个数字,然后获取与初始模式不匹配的下四行
更多详细信息
-行的开头^
-0个或更多空白字符\s*
-一到三位数字\d{1,3}
-匹配的(?:\n(?!\s*\d{1,3}\n.*){4}
-换行符(\n
),它是\n
-()后面没有紧跟着:(?!\s*\d{1,3}\n)
-0个或更多空格\s*
-一位、两位或三位数字\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(.+)
看
-字符串的开头^
-0个或更多除换行符以外的空白字符[^\S\n]*
-一到三位数字(\d{1,3})
-换行符\n
-任何0+空格\s*
-第2组:(\d{6,})
-0个或多个空格字符,而不是换行符、换行符,然后是任何0个或多个空格[^\S\n]*\n\S*
-第3组:14位数字(\d{14})
-0个或更多除换行符和换行符以外的空白字符[^\S\n]*\n
-第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个数字,然后获取与初始模式不匹配的下四行
更多详细信息
-行的开头^
-0个或更多空白字符\s*
-一到三位数字\d{1,3}
-匹配的(?:\n(?!\s*\d{1,3}\n.*){4}
-换行符(\n
),它是\n
-()后面没有紧跟着:(?!\s*\d{1,3}\n)
-0个或更多空格\s*
-一位、两位或三位数字\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(.+)
看
-字符串的开头^
-0个或更多除换行符以外的空白字符[^\S\n]*
-一到三位数字(\d{1,3})
-换行符\n
-任何0+空格\s*
-第2组:(\d{6,})
-0个或多个空格字符,而不是换行符、换行符,然后是任何0个或多个空格[^\S\n]*\n\S*
-第3组:14位数字(\d{14})
-0个或更多除换行符和换行符以外的空白字符[^\S\n]*\n
-第4组:除换行符以外的任何一个或多个字符,尽可能多(.+)
-换行符\n
-第5组:除换行符以外的任何一个或多个字符,尽可能多(.+)
^\s*\d{1,3}(?:(?:\r\n |[\r\n])(?!\s*\d{1,3}\n)。*)*
使用regExp.Mult