Excel 在字符串变量的第二个实例之后捕获子匹配

Excel 在字符串变量的第二个实例之后捕获子匹配,excel,regex,vba,Excel,Regex,Vba,如何在字符串/数字的第二个实例之后捕获两个数字子匹配 我有一个从.txt文件变为.txt文件的#。它被捕获在一个名为“Total”的变量中,我将其声明为字符串。字符串包含数字,格式为123、456789.23或123、456.01。这个数字在.txt文件中出现了大约3次,我已经编写了一个正则表达式模式,它能够捕获这个数字的第一个实例及其子匹配 regex.Pattern = Total & "\s*([\d+\.\d*])\s*([\d+\.\d*])\s*" 我

如何在字符串/数字的第二个实例之后捕获两个数字子匹配

我有一个从.txt文件变为.txt文件的#。它被捕获在一个名为“Total”的变量中,我将其声明为字符串。字符串包含数字,格式为123、456789.23或123、456.01。这个数字在.txt文件中出现了大约3次,我已经编写了一个正则表达式模式,它能够捕获这个数字的第一个实例及其子匹配

regex.Pattern =  Total & "\s*([\d+\.\d*])\s*([\d+\.\d*])\s*"
我试图捕获的.txt文件部分可能显示为

123,456,789.38 

2.180
 
251.517

我想捕捉2.180和251.517

第一个实例包括前面的单词“Number of:”,我试图通过写以下内容使模式避开前面的“:”:

regex.Pattern = "[^:\s]" & Total & "\s*([\d+\.\d*])\s*([\d+\.\d*])\s*"
它仍然会获取第一个实例以及第一个实例之后的数字。第二个实例前面没有任何定义词,只有一个空行,如下面的一行:

123,456,789.38 

2.180 

251.517 
其他信息:

Dim regex As Object:Set regex=CreateObject(“vbscript.regexp”)
regex.Pattern=Total&“\s*([\d+\.\d*])\s*([\d+\.\d*])\s*”
将MCS作为对象
设置MCS=regex.Execute(myText)
作为字符串的尺寸总计:总计=MCS(0)。子匹配(0)
作为字符串的Dim SUBSMTCH1:SUBSMTCH1=MCS(0)。子匹配(1)
作为字符串的Dim submatch2:submatch2=MCS(0)。子匹配(2)
其中,
mytext
是完全作为字符串的.txt文件的内容

变量“Total”的不同实例之间也有单词和数字,例如

我也不确定123456789.38的前两个实例之间会有多少/多少文本/数字,因此我正在尝试考虑如何使其具有灵活性

当我提到第二个实例时,我的意思是数字123456789.38(即名为“Total”的变量)在文档中出现了三次。我想捕获在该数字之后出现的两个子匹配。但是,由于它出现了三次,我想捕获在第二次弹出
123456789.38
后出现的两个子匹配

链接到文本文件。

输出:

submatch1 = 2.180
submatch2 = 251.517
目前,它正在捕获

submatch1 = 97
submatch2 = 5
使用以下模式:

regex.Pattern=Replace(总计,“.”,“\”&“\s*([.\d]+)\s*([.\d]+)”
您可以使用

regex.Pattern=“^(?:[\s\s]*?”&Replace(总计,“.”,“\”&“{2}\D+([.\D]+)\s*([.\D]+)”
这是你可以看到的地方

正如所料

详细信息

  • ^
    -字符串的开头
  • (?:[\s\s]*?123456\.78){2}
    -任何0+字符出现两次,尽可能少,然后
    123456.78
    字符串
  • \D+
    -1个或多个非数字字符
  • ([.\d]+)
    -第1组:一个或多个点或数字
  • \s*
    -0+空格
  • ([.\d]+)
    -第2组:一个或多个点或数字

您将
[
]
放在数字匹配模式的周围,
[\d+\.\d*]
仅匹配单个数字、
+
*
字符,从而破坏了数字匹配模式。使用
\d+(?:,\d+*(?:\。\d+)
匹配数字。请发布,现在还不太清楚您拥有的确切文本和应用的确切模式。@WiktorStribiżew,请查看文章中的编辑,非常感谢您的解释,我明白了为什么它现在只拾取了一个数字!要想出一个可行的办法还是有点难。
Total
变量中到底是什么?为什么使用后要初始化它?如果您的
Total
持有“数字”单词,请查看它如何工作-
^(?:[\s]*?Number){2}\D+(\D+(?:,\D+)*(?:\。\D+))\s+(\D+(?:,\D+)*(?:\。\D+)
()。如果不起作用,请编辑regex fiddle并共享更新的链接,其中包含对不起作用的内容的注释。Hi@WiktorStribiżew,Total变量来自另一个regex模式,它在其中拾取单词“number of:”Dim reg2 As Object:Set reg2=CreateObject(“vbscript.regexp”)reg2后的第一个数字。pattern=“number of:\s*[\$?](\d+[\,\。\d]*)\s*“设置MCS=reg2.Execute(myText)Total=MCS(0)。子匹配(0)将从.txt文件更改为.txt文件。因此,如果使用
regex.Pattern=“^:([\s\s]*?”&Total&>”{2}\d+(\d+,\d+)*(?:\。\d+)(?:\。\d+))*(?::\。。\d+))\s+)(\d+)(?::\。。。\d+)
,它现在起作用了吗?嗨,Wiktor,我摆弄了一下我的总变量,你的建议起作用了!再次感谢你的帮助,看起来这是一个变量值的问题。
submatch1 = 2.180
submatch2 = 251.517
submatch1 = 97
submatch2 = 5