Regex vba excel和正则表达式
我有一些网站的代码(如下所示),它允许我传入一个字符串,findstring和replace string,如果找到它,它将只替换一个完整的单词。我遇到的问题是,我的单词后面有一个减号,它把它当作一个单独的单词 比如说 你好 你好-1 当我告诉它用doodie替换Howdy时,它分别用doodie和doodie-1替换Howdy和Howdy-1。我想用它来代替一个单词,而不是一个在单词后面有-1或任何其他符号的单词,比如Howdy#1 这可能吗。在我的代码中,howdy和doodie来自电子表格中的单元格 正在执行替换的函数Regex vba excel和正则表达式,regex,vba,Regex,Vba,我有一些网站的代码(如下所示),它允许我传入一个字符串,findstring和replace string,如果找到它,它将只替换一个完整的单词。我遇到的问题是,我的单词后面有一个减号,它把它当作一个单独的单词 比如说 你好 你好-1 当我告诉它用doodie替换Howdy时,它分别用doodie和doodie-1替换Howdy和Howdy-1。我想用它来代替一个单词,而不是一个在单词后面有-1或任何其他符号的单词,比如Howdy#1 这可能吗。在我的代码中,howdy和doodie来自电子表格
Public Function RegExpReplaceWord(ByVal strSource As String, ByVal strFind As String, ByVal strReplace As String) As String
' Purpose : replace [strFind] with [strReplace] in [strSource] '
' Comment : [strFind] can be plain text or a regexp pattern; '
' all occurences of [strFind] are replaced '
'requires reference to Microsoft VBScript Regular Expressions '
'Dim re As RegExp '
'Set re = New RegExp '
'late binding; no reference needed '
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.IgnoreCase = True ' <-- case insensitve
re.Pattern = "\b" & strFind & "\b"
RegExpReplaceWord = re.Replace(strSource, strReplace)
Set re = Nothing
End Function
公共函数RegExpReplaceWord(ByVal strSource作为字符串,ByVal strFind作为字符串,ByVal strReplace作为字符串)作为字符串
'目的:将[strSource]中的[strFind]替换为[strReplace]'
'注释:[strFind]可以是纯文本或regexp模式;'
'所有出现的[strFind]都被替换'
'需要引用Microsoft VBScript正则表达式'
“您作为RegExp”
'Set re=New RegExp'
后期装订;无需参考'
作为对象的模糊re
Set re=CreateObject(“VBScript.RegExp”)
re.Global=True
re.IgnoreCase=True'将$
放在正则表达式模式的末尾,以便它知道它必须是字符串的结尾。有关更多类似于此的语法,请尝试查看:
您的问题是\b
匹配“单词边界”,即字母、数字或下划线与非上述字符邻接的任何位置,或与锚定符(如$
)邻接的任何位置。Howdy-1
在y
和-
之间有一个单词边界,这就是您的模式在那里匹配的原因。如果要匹配整个单词,则需要修改模式以包括空格和锚定:
re.Pattern = "(^| )" & strFind & "( |$)"
交替(<代码><代码>)将允许你查找单词,它在字符串的开头(<代码> ^ <代码>)中有尾随的空间,或者在字符串的结尾(<代码> $< /代码>)前面有一个空间,或者位于字符串的中间,在其两边有一个空间。
由于空格是通过捕获组(即括号)捕获的,因此您可以在替换操作中包含空格,以确保保留空格:
RegExpReplaceWord = re.Replace(strSource, "$1" & strReplace & "$2")
$1
表示捕获组1,它是第一组括号(从右向左读取),而$2
表示捕获组2,它是第二组括号。如果某个组捕获了一个空格,则该空格将分别追加到替换中。如果任何一组都“捕获”了字符串的开头或结尾,则实际上捕获的是空字符串,这就是将在替换中追加的内容。请将您的问题标题包含在标记信息的重复之外。您的标题应该描述您遇到的问题或您提出的问题,这对在搜索结果列表中看到它的未来用户很有用。谢谢。这种方法行得通,但它会去掉单词之间的空格。虽然它修复了Howdy-1,并意识到它不是Howdy,但在其他正在替换单词(如“球是绿色的”用卡车搜索“球替换”)的系统中,它会在替换中返回“卡车绿色”,您可以参考捕获组1和2,它们通过使用上面的括号启用。我会更新答案。事实上,我找到了一种方法,只是在我的replace中添加了空格,如果它在字符串的开头或结尾,就对它进行修剪。很好的回答