Regex 正则表达式在某些文本之前提取数据

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("

我有一些大型文本文档,其中包含一些我想要提取的数据

正如您在屏幕截图中看到的,我想将文件名旁边的A040列提取到excel

A040之前,始终有三个空格,而不是文本工作表(也在屏幕截图中)

每个文件都有不同的编号,并且总是有三位数的字母A和文本表。-->上载的示例文件:

我有一些东西已经在VB与Excel,但它不工作

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可以使用的功能。