Regex 通过正则表达式获取模式的不匹配部分

Regex 通过正则表达式获取模式的不匹配部分,regex,vba,excel,Regex,Vba,Excel,在本主题中,我们的想法是通过正则表达式将数字“剥离”,除以ax 因此,来自: uni3uios3_300x250_ASDF.html 我想通过正则表达式实现: 300x250 我已经设法实现了完全相反的目标,我正在努力争取一些时间来完成需要做的事情。 这就是我到目前为止所拥有的: Public Function regExSampler(s As String) As String Dim regEx As Object Dim inputMatches

在本主题中,我们的想法是通过正则表达式将数字“剥离”,除以a
x

因此,来自:

uni3uios3_300x250_ASDF.html
我想通过正则表达式实现:

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

这正是我想通过正则表达式来解释的

IF
块更改为

    If regEx.test(s) Then
        regExSampler = InputMatches(0)
    Else
        regExSampler = s
    End If
你的结果会回来的

300x250
34300x25
8x4

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

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

解决方案

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

说明

^.*\D(?=\d+x\d+)|\D+$
  • ^.*\D
    -这里我们将匹配从字符串开始到到达非数字(
    \D
    )字符的每个字符
  • (?=\d+x\d+)
    -这是一个积极的前瞻。这意味着前一个模式(
    ^..*\D
    )只有在后面紧跟着它内部描述的模式(
    \D+x\D+
    )时才应该匹配。前瞻本身不会捕获任何字符,因此正则表达式不会捕获模式
    \d+x\d+

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

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

您不需要捕获组
()
<代码>[0-9]+x[0-9]+@S.Kablar-是的,但一旦我设法让它工作起来,我就没有再碰它:)如果他在未来寻找这两个维度中的每一个,
()
,那就太好了。他可能只发布了函数的一部分供我们查看。此正则表达式可能会起作用:
^(.*\D)(?=\D+x\D+)|(\D+$)
@PedroCorso-如果您愿意回答并解释其中的每一部分,我将选择它!干得好,谢谢!对于字符串来说,这将失败,就像我试图想到一个不假设字符串上存在下划线的正则表达式一样,但是现在您已经指出,在指定的模式之后可能会有数字,我只能看到这个解决方案:
^..*.\u(?=\ d+x\d+)|.*$
。基本上,我已经将正则表达式调整为使用
\uu
作为参考,而不是
\D