Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex vba excel和正则表达式_Regex_Vba - Fatal编程技术网

Regex vba excel和正则表达式

Regex vba excel和正则表达式,regex,vba,Regex,Vba,我有一些网站的代码(如下所示),它允许我传入一个字符串,findstring和replace string,如果找到它,它将只替换一个完整的单词。我遇到的问题是,我的单词后面有一个减号,它把它当作一个单独的单词 比如说 你好 你好-1 当我告诉它用doodie替换Howdy时,它分别用doodie和doodie-1替换Howdy和Howdy-1。我想用它来代替一个单词,而不是一个在单词后面有-1或任何其他符号的单词,比如Howdy#1 这可能吗。在我的代码中,howdy和doodie来自电子表格

我有一些网站的代码(如下所示),它允许我传入一个字符串,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中添加了空格,如果它在字符串的开头或结尾,就对它进行修剪。很好的回答