excel - VBA 正则表达式 - 使用 \b 并在单词边界的末尾包含“-”
问题描述
我不熟悉 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!
------
推荐阅读
- date - 我需要将 pandas 中的日期时间序列从每秒简化到每天表示全天捕获的数据
- android - Android中带有标题的边框
- java - Java - intellij 与命令提示符
- google-maps - Google 地图不会针对触摸操作进行更新(放大、减号、捏合,...)
- python - 定义非矩形几何并生成网格 python
- java - 在tomcat上部署Spring引导项目(调度程序项目)时出错
- django - 存在模式的 NoReverseMatch 错误
- java - 如何将我的改造数据从 MainActivity 发送到我的片段?
- java - 致命错误:区域分配失败 - 进程内存不足 + eirslett-frontend-maven-plugin + Java + webpack + Maven
- azure - 显示资源未找到消息的 Azure 警报报告