Regex 通过正则表达式获取模式的不匹配部分
在本主题中,我们的想法是通过正则表达式将数字“剥离”,除以aRegex 通过正则表达式获取模式的不匹配部分,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
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
。