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 正则表达式匹配模式的主要内容,如果未能解决你的问题,请参考以下文章

excel VBA匹配,这是我写的正则表达式:

正则表达式方法

基础扩展 | 08. VBA正则表达式

一个可以使用多个正则表达式进行多次尝试匹配,并进行替换的Excel VBA自定义函数(UFD)

perl模糊匹配文件名

求VBA中一简单正则表达式