我正在尝试在一大段文本中搜索所有出现的双打。文本表示系统中多个缺陷的描述。我正在寻找的双打是深度,通常在文本中多次为" n.nnnW X n.nnnL X n.nnnD"。 n.nnn
通常为0.017D
(示例)但如果有问题,我想考虑5.567D
。
问题在于,还出现了within 1.5d of
和a .015dia
这两个词。这些字母的案例也有所不同,有些都是大写的,有些都是小写的。文本有时在数字和" d"之间也有一个空格。有时会说出“#34; deep"或者"深度"像这样:0.017 deep
。
我最终需要将值提取为双精度数,以便我可以对它们进行数学运算。
我有以下正则表达式模式:[.](?:\d*\.)?\d+(\s?)[dD](?!ia|IA)
这种模式似乎可以找到我需要的所有东西,甚至可以消除拼写为n.nnndia
或n.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