VBA 正则表达式匹配模式
Posted
技术标签:
【中文标题】VBA 正则表达式匹配模式【英文标题】:VBA Regular Expression Matching Pattern 【发布时间】:2018-09-26 14:32:45 【问题描述】:我有 RF123456789、RF1234567890 等记录。
我只想匹配以“RF”开头的记录,后跟正好 9 位数字。如果大于 9 位或小于 9 位,则应显示无效。我写了下面的代码,但问题是,如果数字超过 9,它也显示有效。我知道我写信是为了检查它是否以 RF 开头并后跟 9 位数字,所以如果是 10 位数字,它显然与我的模式匹配。有什么办法可以将其限制为 9 位而不是 10 位?
Set myrange = Range("C2:C" & Rng)
For Each c In myrange
strinput = c.Value
patn = "([r|R][f|F][0-9]9)"
If patn <> "" Then
With regex
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = patn
End With
If regex.Test(strinput) Then
c.Offset(0, 5) = "Valid"
Else
c.Offset(0, 5) = "Invalid"
End If
End If
''checking Column D and E are matching or not''
If c.Offset(0, 1) <> "" Then
If c.Offset(0, 1) = c.Offset(0, 2) Then
c.Offset(0, 6) = "Matching"
Else
c.Offset(0, 6) = "Not Matching"
End If
Else
c.Offset(0, 6) = "Empty"
End If
Next
【问题讨论】:
你能在最后添加'行尾'锚$
,就像这样[r|R][f|F][0-9]9$
吗?
【参考方案1】:
您根本不应该为此使用正则表达式。一个简单的Like
语句就可以了。
只需使用strinput Like "RF#########"
。如果它以 RF 开头(不区分大小写)然后有 9 位数字,则返回 true,否则返回 false。
【讨论】:
同意。更明智。 非常感谢。有效。不过我更改了整个代码..:P @VigneshYalax 作为新的贡献者,您可能没有意识到,由于这个答案解决了您的问题,因此习惯上“接受”答案,以便 Erik 因帮助您而获得赞誉,并让其他人在搜索类似问题时有所帮助。【参考方案2】:用边界包裹它?
\bRF\d9\b
试试here
\bRF\d9\b / 通用汽车
\b
在字边界处断言位置(^\w|\w$|\W\w|\w\W)
RF
与字符 RF 字面匹配(区分大小写)
\d9
匹配一个数字(等于[0-9]
)
9
量词——精确匹配 9 次
\b
在字边界处断言位置(^\w|\w$|\W\w|\w\W)
更新:
有很多方法可以说明领先 2 个数字或 RF。一种可能是:
\b(\d2|RF)\d9\b
试试it。
更熟悉正则表达式的人无疑可以就有效的正则表达式方法提出建议。
【讨论】:
您好感谢您的快速回复。它有效,但我现在的问题是我正在使用两个条件,比如它可以以数字或 RF 开头。下面是代码,请帮助我的伙伴。为 myrange 中的每个 c 设置 myrange = Range("C2:C" & Rng) strinput = c.Value patn = "([0-9]9,10)|([r|R][f|F] [0-9]9)" If patn "" Then With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = patn ^^^ 范围蔓延! @VigneshYalax 添加了第二种方法。最好在问题中首次说明确切的要求,以得出符合目的的答案。【参考方案3】:你也可以使用left() right() len() 和isnumeric()等字符串函数
要检查整个字符串的长度是否为 11 个字符(RF + 9 位),您可以使用:
If len(yourstring) = 11 then
检查字符串是否以 RF 开头:
If left(yourstring,2)="RF" then
要检查最后 9 个字符是否是数字,只有第一个维度是变体:
dim num_check as variant
num_check = right(yourstring,9)
If isnumeric(num_check) = False then
您可以嵌套或组合这些 if 语句以获得所需的结果。
【讨论】:
那是有风险的。 -5.5 是数字,但 OP 不想匹配点或破折号。以上是关于VBA 正则表达式匹配模式的主要内容,如果未能解决你的问题,请参考以下文章