我正在为一个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呢?
1条答案
按热度按时间roejwanj1#
您可以使用
以得到
22.13
作为输出。tot\w(?:.*\D)?(\d+[.,]\d{2})
正则表达式匹配tot
-一个tot
字符串\w
-任意单词char(我保留了它,因为您在原始模式中有它,但您最好删除它)(?:.*\D)?
-一个可选的模式,匹配除换行符外的任何零个或多个字符,然后是一个非数字字符(用于获取"最后一个数字")(\d+[.,]\d{2})
-组1(我们将通过match.SubMatches(0)
访问该值):一个或多个数字,然后是.
或,
,然后是两位。