通过RegEx获取模式的不匹配部分

时间:2018-01-25 16:08:47

标签: regex vba excel-vba excel

在本主题中,我们的想法是采取" strip"数字,通过RegEx除以x。 - > How to extract ad sizes from a string with excel regex

因此来自:

uni3uios3_300x250_ASDF.html

我想通过RegEx实现:

300x250

我已经设法达到了完全相反的目标,我正在努力争取一些时间来完成需要做的工作。 这就是我现在所拥有的:

Public Function regExSampler(s As String) As String

    Dim regEx           As Object
    Dim inputMatches    As Object
    Dim regExString     As String

    Set regEx = CreateObject("VBScript.RegExp")    
    With regEx
        .Pattern = "(([0-9]+)x([0-9]+))"
        .IgnoreCase = True
        .Global = True    
        Set inputMatches = .Execute(s)    
        If regEx.test(s) Then
            regExSampler = .Replace(s, vbNullString)
        Else
            regExSampler = s
        End If    
    End With

End Function

Public Sub TestMe()    
    Debug.Print regExSampler("uni3uios3_300x250_ASDF.html")
    Debug.Print regExSampler("uni3uios3_34300x25_ASDF.html")
    Debug.Print regExSampler("uni3uios3_8x4_ASDF.html")    
End Sub

如果你运行TestMe,你会得到:

uni3uios3__ASDF.html 
uni3uios3__ASDF.html
uni3uios3__ASDF.html

这正是我想通过RegEx剥离的东西。

2 个答案:

答案 0 :(得分:8)

IF块更改为

    If regEx.test(s) Then
        regExSampler = InputMatches(0)
    Else
        regExSampler = s
    End If

您的结果将会返回

300x250
34300x25
8x4

这是因为InputMatches保存了RegEx执行的结果,它保存了您匹配的模式。

答案 1 :(得分:3)

根据OP的要求,我将此作为答案发布:

<强>解决方案

^.*\D(?=\d+x\d+)|\D+$

演示regex101.com

<强>解释

  • ^.*\D - 这里我们匹配字符串开头的每个字符,直到达到非数字(\D)字符。
  • (?=\d+x\d+) - 这是一个积极的前瞻。这意味着前一个模式(^.*\D)只应匹配,如果后面跟着它描述的模式(\d+x\d+)。前瞻本身不会捕获任何字符,因此正则表达式不会捕获模式\d+x\d+

  • \d+x\d+ - 这个应该很容易理解,因为它等同于[0-9]+x[0-9]+。如您所见,\d是代表任何数字字符的标记。

  • \D+$ - 此模式匹配一​​个或多个非数字字符,直到它到达字符串的末尾。
  • 最后,两个模式都通过OR条件(|)链接,以便整个正则表达式匹配一种模式或另一种模式。