regex VBA正则表达式问题,尝试仅从匹配项中提取数值

2skhul33  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(118)

我正在为一个RegEx问题而挣扎。我刚刚开始探索RegEx,所以我还不太熟悉所有的选项。下面是我的问题:
1.我正在将一个文本文件(发票转换为文本)内容读入变量
1.我想查一下发票上的总价
1.文件中的单词“total”可以用许多不同的方式书写,如下所示:'tot' '总计:' '总计欧元:' '总计金额:“总值”等
下面是我的示例文本文件:

<etc>
BTW-nr: 0071.21.210 B 08
KvK 27068921
TOTAL € 22.13
Maestro € 22.13
<etc>.

这是我解析文件的函数:

Public Function parse(inpPat As String)

'get the text file content
strFilename = "D:\temp\invoice.txt"
Open strFilename For Input As #iFile
strFileContent = Input(LOF(iFile), iFile)
Close #iFile

Set regexOne = New RegExp
regexOne.Global = False 
regexOne.IgnoreCase = True

regexOne.Pattern = inpPat    
   
Set theMatches = regexOne.Execute(strFileContent)
    
'show the matching strings
For Each Match In theMatches
    res = Match.Value
    Debug.Print res
Next

End Function

要计算总数,我可以使用以下公式:

parse "tot[\w]+.+(\d+(\.|,)\d{2})"

结果是这样的:

TOTAL € 22.13

欧元符号由于某种原因被扭曲了,但我并不关心这个问题。(也有发票省略了欧元符号)。问题是,我只想从结果字符串(22 - 13)中提取数值。我知道我可以创建一个VBA函数来实现这一点,但直接在regex模式中执行要干净得多。我尝试了以下操作:

parse "(?:(?!tot[\w]+.+))(\d+(\.|,)\d{2})"

但这给了我这个结果:

0071.21

它忽略了'Total'短语,返回了模式第二部分的第一个匹配项。我怎样才能只提取数字22.13呢?

roejwanj

roejwanj1#

您可以使用

Dim strFileContent As String
strFileContent = "<etc>" & vbLf & "BTW-nr: 0071.21.210 B 08" & vbLf & "KvK 27068921" & vbLf & "TOTAL € 22.13" & vbLf & "Maestro € 22.13" & vbLf & "<etc>."

Set regexOne = New regExp
regexOne.Global = False
regexOne.IgnoreCase = True

regexOne.pattern = "tot\w(?:.*\D)?(\d+[.,]\d{2})"
   
Set theMatches = regexOne.Execute(strFileContent)
    
'show the matching strings
For Each Match In theMatches
    res = Match.SubMatches(0)
    Debug.Print res
Next

以得到22.13作为输出。
tot\w(?:.*\D)?(\d+[.,]\d{2})正则表达式匹配

  • tot-一个tot字符串
  • \w-任意单词char(我保留了它,因为您在原始模式中有它,但您最好删除它)
  • (?:.*\D)?-一个可选的模式,匹配除换行符外的任何零个或多个字符,然后是一个非数字字符(用于获取"最后一个数字")
  • (\d+[.,]\d{2})-组1(我们将通过match.SubMatches(0)访问该值):一个或多个数字,然后是.,,然后是两位。

相关问题