首页 > 解决方案 > VBA 正则表达式 - 使用 \b 并在单词边界的末尾包含“-”

问题描述

我不熟悉 VBA 中的正则表达式,但必须调试其他人编写的代码。

我知道这\b匹配基于单词边界的位置并排除非单词字符,例如-.

但是,我需要代码来匹配-某些字符串中的那些。

例如,

cats and dogssearch_criteria:中匹配i have cats and dogs代码:

"\b" & search_criteria & "\b"  

作品。

但是,这并没有匹配:

dogs - search_criteria:dogs - sleeping
不起作用。

是一个列表,其中search_criteria包含不以 结尾的-字符串和以 . 结尾的字符串-

像这样:

dogs -  
cats -   
cats and dogs  
houses  
cars  
work -  

我基本上必须更改\b代码末尾的,但需要帮助:

"\b" & search_criteria & "\b"

标签: excelregexvba

解决方案


这是您需要自适应词边界(我更喜欢使用的术语)的情况。由于您拥有的所有术语都以单词 char 开头,因此您可以继续将\b其用作左侧边界。

右侧边界是\b(如果最后一个字符是单词字符)或根本没有边界检查,因为您不关心 . 之后是否有单词或非单词字符-

所以,你只需要

Function BuildBoundaryPattern(pattern As String) As String
BuildBoundaryPattern = "\b" & pattern
If Right(pattern, 1) Like "[a-zA-Z0-9_]" Then
    BuildBoundaryPattern = BuildBoundaryPattern & "\b"
End If
End Function

这将为每次检查建立正确的模式。

查看测试子:

Sub TestBBP()
Dim vbRegX As Object, vbRegXMatch As Object, pattern As String
Dim arr() As String: arr = Split("dogs -,cats -,cats and dogs,houses,cars,work -", ",")

For x = 0 To UBound(arr)
  Set vbRegX = New regExp
  vbRegX.pattern = BuildBoundaryPattern(arr(x))
  If vbRegX.Test(arr(x) & " sleeping") Then
    Debug.Print ("'" & arr(x) & "' in '" & arr(x) & " sleeping' matched!")
  End If
  If vbRegX.Test(arr(x) & "Sleeping") Then
    Debug.Print ("'" & arr(x) & "' in '" & arr(x) & " sleeping' matched!")
  End If
  Debug.Print ("------")
Next x
End Sub

输出:

'dogs -' in 'dogs - sleeping' matched!
'dogs -' in 'dogs - sleeping' matched!
------
'cats -' in 'cats - sleeping' matched!
'cats -' in 'cats - sleeping' matched!
------
'cats and dogs' in 'cats and dogs sleeping' matched!
------
'houses' in 'houses sleeping' matched!
------
'cars' in 'cars sleeping' matched!
------
'work -' in 'work - sleeping' matched!
'work -' in 'work - sleeping' matched!
------

推荐阅读