Access VBA中的Lookbehind

时间:2017-09-18 20:12:24

标签: regex vba vbscript access-vba

我正在尝试在一大段文本中搜索所有出现的双打。文本表示系统中多个缺陷的描述。我正在寻找的双打是深度,通常在文本中多次为" n.nnnW X n.nnnL X n.nnnD"。 n.nnn通常为0.017D(示例)但如果有问题,我想考虑5.567D

问题在于,还出现了within 1.5d ofa .015dia这两个词。这些字母的案例也有所不同,有些都是大写的,有些都是小写的。文本有时在数字和" d"之间也有一个空格。有时会说出“#34; deep"或者"深度"像这样:0.017 deep

我最终需要将值提取为双精度数,以便我可以对它们进行数学运算。

我有以下正则表达式模式:[.](?:\d*\.)?\d+(\s?)[dD](?!ia|IA)

这种模式似乎可以找到我需要的所有东西,甚至可以消除拼写为n.nnndian.nnnDIA的直径。模式未捕获的是within 1.5d of文本。

经过一些轻微的研究后,我注意到在VBA中不支持后视代码;即便如此,无论如何我都无法使用lookbehind模式(使用Regex101)。

这是我的Access VBA代码,用于说明我是如何做到的。 r EXP(0)值是我上面的模式。

Set rs2 = CurrentDb.OpenRecordset("SELECT * FROM [NCR_RawImport-TEXT] WHERE " & skinTermSQL, dbOpenSnapshot)
'rEXP(0) = "[.](?:\d*\.)?\d+(\s?)[dD](?!ia|IA)"
tVAL = (CDbl(Me.cmbGDepth.Value) / 1000)
Do While Not rs2.EOF
    found = False
    Set regEXP1 = CreateObject("VBScript.RegExp")
    regEXP1.IgnoreCase = True
    regEXP1.Global = True
    For i = 0 To rEXPIndx - 1
        regEXP1.Pattern = rEXP(i)
        Set Matches = regEXP1.Execute(rs2.NARR_TXT)
        For Each Match In Matches
            aVAL = CDbl(Trim(Replace(Replace(UCase(Match.Value), " D", ""), "D", ""))) 'convert matched value to a double.
            If (aVAL >= tVAL) Then
                found = True
            End If
        Next
        Set Matches = Nothing
    Next i
    Set regEXP1 = Nothing
    If (found) Then
        strSql = "UPDATE [NCR_FinalData] SET [NCR_FinalData].SRCH = [NCR_FinalData].SRCH & 'G' WHERE [NCR_FinalData].SRCH Not Like '*G*' AND [NCR_FinalData].NC_KEY = '" & rs2.NC_KEY & "';"
        Call writeLog("cmdUpdateNCRs: " & strSql)
        DoCmd.RunSQL strSql
    End If
    rs2.MoveNext
Loop
Set rs2 = Nothing

0 个答案:

没有答案