我不熟悉 VBA 中的正则表达式,但必须调试其他人编写的代码。
我了解 \b
匹配基于单词边界的位置并排除非单词字符,如 -
.
但是,我需要代码来匹配 -
在一些字符串中。
例如,
匹配 cats and dogs
在 search_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"
最佳答案
这是您需要自适应词边界(我更喜欢使用的术语)的情况。由于您拥有的所有术语都以单词 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!
------
关于excel - VBA 正则表达式 - 使用\b 并在单词边界的末尾包含 "-",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69354094/