正则表达式仅返回七位数字匹配

tjb*_*jb1 1 regex excel vba

我一直在尝试构建一个正则表达式来从字符串中提取 7 位数字,但很难获得正确的模式。

示例字符串 -WO1519641 WO1528113TB WO1530212 TB

返回示例 -1519641, 1528113, 1530212

我在 Excel 中使用的代码是...

Private Sub Extract7Digits()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A300")

    For Each c In Myrange
        strPattern = "\D(\d{7})\D"
        'strPattern = "(?:\D)(\d{7})(?:\D)"
        'strPattern = "(\d{7}(\D\d{7}\D))"

        strInput = c.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.test(strInput) Then
            Set matches = regEx.Execute(strInput)
            For Each Match In matches
                s = s & " Word: " & Match.Value & " "
            Next
                c.Offset(0, 1) = s
            Else
                s = ""
        End If

    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

O1519641, O1528113T, O1530212我已经尝试了该代码中的所有 3 种模式,但最终在使用时得到了返回"\D(\d{7})\D"。据我现在了解,()由于我存储匹配的方式,这没有任何意义,而我最初认为它们意味着表达式将返回().

我一直在http://regexr.com/上进行测试,但我仍然不确定如何让它允许数字按原样位于字符串内,WO1528113TB但只返回数字。我是否需要对正则表达式的返回值运行正则表达式以排除第二次的字母?

Wik*_*żew 5

我建议使用以下模式:

strPattern = "(?:^|\D)(\d{7})(?!\d)"
Run Code Online (Sandbox Code Playgroud)

然后,您将能够(\d{7})通过 访问捕获组#1 的内容(即使用正则表达式的部分捕获的文本)match.SubMatches(0),然后您可以检查哪个值是最大的。

图案详情

  • (?:^|\D)- 匹配字符串 ( ^) 或非数字 ( \D)开头的非捕获组(不创建任何子匹配)
  • (\d{7})- 捕获第1组匹配的7位数字
  • (?!\d)- 如果 7 位数字后紧接着有一个数字,则负向预测会使匹配失败。