正则数字间隔与数字VBA之前和之后的可能字符

时间:2015-10-26 11:03:33

标签: regex vba excel-vba excel

我试图生成一个正则表达式,可以识别VBA中字符串间隔内的数字。有时这个数字周围有字符,有时则不是(来自供应商的不一致表示法)。该表达式应该标识下面三个示例中的1413在500-2000的数字范围内(或者在0-50或51-499的数字范围内它)。

示例:

  • Test 12/2014. Tot.flow:1413 m3
  • Test 12/2014. Tot.flow:1413m3
  • Test 12/2014. Tot.flow: 1413

这些字符串有一些标识符:

  • 数字
  • 之前总会有一个冒号
  • 冒号和数字之间可能有空格
  • 号码与m3
  • 之间可能有空格
  • m3不一定总是存在,如果不存在,则该数字位于字符串的末尾

到目前为止,我尝试制作一个正则表达式,找到数字范围是([5-9][0-9][0-9]|[1]\d{3}|2000),但这也匹配所有三位数字(2001年匹配200)。但是,据我所知,我错过了几个概念来实现这里的最终目标。我想我的问题如下:

  1. 如何在不为零的情况下开始间隔(在零间隔开始时发现许多问题)
  2. 如何考虑flow:m3的注释变化?
  3. 对检查该号码是否在数字范围内感兴趣。这让我疯狂,所有的帮助都非常感谢!

2 个答案:

答案 0 :(得分:3)

您可以使用以下正则表达式使用regExp.Replace()提取数字:

^.*:\s*(\d+).*$

替换部分为$1

然后,使用通常的数字比较来检查该值是否在预期范围内(例如If CLng(result) > 499 And If CLng(result) < 2001 Then ...)。

测试宏:

Dim re As RegExp,tgt As String,src As String

Set re = New RegExp
With re
  .pattern = "^.*:\s*(\d+).*$"
  .Global = False
End With
src = "Test 12/2014. Tot.flow: 1413"
tgt = re.Replace(src, "$1")
MsgBox (CLng(tgt) > 499 And CLng(tgt) < 2001)

答案 1 :(得分:1)

您可以尝试:

:\s?([5-9]\d\d|1\d{3}|2000)\s?(m3|\n)

另外,我认为你的正则表达式([5-9][0-9][0-9]|[1]\d{3}|2000)很好,它不应该匹配数字&gt; 500和2000&lt;。