Regex 正则表达式在某些文本之前提取数据
我有一些大型文本文档,其中包含一些我想要提取的数据 正如您在屏幕截图中看到的,我想将文件名旁边的A040列提取到excel 在A040之前,始终有三个空格,而不是文本工作表(也在屏幕截图中) 每个文件都有不同的编号,并且总是有三位数的字母A和文本表。-->上载的示例文件: 我有一些东西已经在VB与Excel,但它不工作Regex 正则表达式在某些文本之前提取数据,regex,vba,excel,Regex,Vba,Excel,我有一些大型文本文档,其中包含一些我想要提取的数据 正如您在屏幕截图中看到的,我想将文件名旁边的A040列提取到excel 在A040之前,始终有三个空格,而不是文本工作表(也在屏幕截图中) 每个文件都有不同的编号,并且总是有三位数的字母A和文本表。-->上载的示例文件: 我有一些东西已经在VB与Excel,但它不工作 Dim cell As Range Dim rng As Range Dim output As String Set rng = ws.Range("
Dim cell As Range
Dim rng As Range
Dim output As String
Set rng = ws.Range("A1", ws.Range("A1").SpecialCells(xlLastCell).Address)
For Each cell In rng
On Error Resume Next
output = ExtA(cell.Value)
If Len(output) > 0 Then
Range("B" & j) = output
Exit For
End If
Next
j = j + 1
ws.Cells.ClearContents
'Call DelConns
strFileName = Dir 'next file
Loop
End Sub
Function ExtA(ByVal text As String) As String
'REGEX Match VBA in excel
Dim result As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
RE.Pattern = "(?<=Sheet)[^Sheet]*\ Sheet"
RE.Global = True
RE.IgnoreCase = True
Set allMatches = RE.Execute(text)
If allMatches.Count <> 0 Then
result = allMatches.Item(0).submatches.Item(0)
End If
ExtA = result
End Function
Dim单元格作为范围
变暗rng As范围
将输出设置为字符串
设置rng=ws.Range(“A1”,ws.Range(“A1”).SpecialCells(xlLastCell).Address)
对于rng中的每个单元
出错时继续下一步
输出=ExtA(cell.Value)
如果Len(输出)>0,则
范围(“B”&j)=输出
退出
如果结束
下一个
j=j+1
ws.Cells.ClearContents
“打电话给德尔康
strFileName=Dir“下一个文件”
环
端接头
函数ExtA(ByVal文本作为字符串)作为字符串
'正则表达式匹配excel中的VBA
将结果变暗为字符串
将所有匹配项设置为对象
作为对象的模糊RE
Set RE=CreateObject(“vbscript.regexp”)
RE.Pattern=“(?您的意思是说A040后面和“Sheet”前面有4个空格吗?如果是,请尝试此模式:
.pattern = "(A\d\d\d)\s{3}Sheet"
编辑:我以为你说的是4个空格,但你说的是3。我的模式现在反映了这一点。
编辑2:(我需要更多的咖啡!)将\b改为\s。这似乎对您的示例有效
Option Explicit
Function AthreeDigits(str As String)
Dim n As Long, nums() As Variant
Static rgx As Object, cmat As Object
'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF
If rgx Is Nothing Then
Set rgx = CreateObject("VBScript.RegExp")
Else
Set cmat = Nothing
End If
AthreeDigits = vbNullString
With rgx
.Global = False
.MultiLine = True
.Pattern = "\A[0-9]{3}[\s]{3}Sheet"
If .Test(str) Then
Set cmat = .Execute(str)
AthreeDigits = Left(cmat.Item(0), 4)
End If
End With
End Function
参见这里的示例
“\s+[Aa]\d*\s+表”
或
\s+[Aa]\d*\s+(表)
或
[Aa]\d*\s+(页)
演示
\s+
匹配任何空白字符(等于[\r\n\t\f\v]
)
+
量词-在一次和无限次之间匹配,尽可能多地匹配
Aa
匹配列表中的单个字符Aa
(区分大小写)
\d*
匹配一个数字(等于[0-9]
)
*
量词-尽可能多地在零次和无限次之间匹配
这看起来像VBA,而不是VB.NET。在VBA中,regex不支持lookbehinds。您需要替换”(?是的,soory,我已经正确地更改了它,但这不起作用,我现在已经尝试过了。您的意思是A040之后总是有三个空格,而不是文本表(不是之前)?这些在Excel电子表格中看起来如何?您可以使用类似这样的模式,并使用子匹配来提取括号内的部分(a[0-9]{3})\s{3}表您可以通过使用类似以下内容来消除左侧。pattern=“a\d{3}(?=\s+Sheet)”
这一点很好。我担心我的正则表达式模式非常冗长,没有说服力,但希望我的样板功能接近OP可以使用的功能。