Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel VBA-字符串替换-reg exp?_Vba_Excel - Fatal编程技术网

Excel VBA-字符串替换-reg exp?

Excel VBA-字符串替换-reg exp?,vba,excel,Vba,Excel,我正在Excel VBA中进行一些单词替换。替换由任何特殊字符(a-z、a-z、0-9除外)分隔的单词本身,并保留大小写 正确更换的示例(将示例替换为替换): 一个示例字符串一个替换字符串 一个示例字符串一个替换字符串 一个示例,字符串一个替换,字符串 One>示例替换”&Rng.Value&“&Rng.Offset(0,1)。Value&“试试这段代码,不需要使用正则表达式: str = Cells(rowNumber, columnNumber).Value str = Replace(st

我正在Excel VBA中进行一些单词替换。替换由任何特殊字符(a-z、a-z、0-9除外)分隔的单词本身,并保留大小写

正确更换的示例(将
示例
替换为
替换
):

一个示例字符串
一个替换字符串

一个示例字符串
一个替换字符串

一个示例,字符串
一个替换,字符串

One>示例
One>替换
(前面和后面的特殊字符)

一个dexamples字符串
一个dexamples字符串
示例
未替换)

我通过使用几行代码使它工作,如下所示。如何使用regexp或类似的方法实现这一点

cel.Replace what:=" " & Rng.Value & " ", replacement:=" " & Rng.Offset(0, 1).Value & " ", MatchCase:=True
cel.Replace what:=" " & Rng.Value & ",", replacement:=" " & Rng.Offset(0, 1).Value & ",", MatchCase:=True
cel.Replace what:=">" & Rng.Value & "<", replacement:=">" & Rng.Offset(0, 1).Value & "<", MatchCase:=True
...
cel.Replace what:=''&Rng.Value&'',replacement:=''&Rng.Offset(0,1)。Value&'',MatchCase:=True
cel.Replace what:=“”&Rng.Value&“,”,replacement:“”&Rng.Offset(0,1)。Value&“,”,MatchCase:=True

cel.Replace what:=“>”&Rng.Value&“&Rng.Offset(0,1)。Value&“试试这段代码,不需要使用正则表达式:

str = Cells(rowNumber, columnNumber).Value
str = Replace(str, " example", " replaced")
str = Replace(str, " Example", " Replaced")
str = Replace(str, ">example", ">replaced")
str = Replace(str, ">Example", ">Replaced")
Cells(rowNumber, columnNumber).Value = str
或者使用正则表达式模式

\b[E|e]xample\b
Regex:

Option Explicit
Public Sub test()
    Dim arr(), i As Long
    arr = Array("One dexamples string", "One example string", "One >example< string", "One Example, string", "One Example string", "One example string")
    For i = LBound(arr) To UBound(arr)
        Debug.Print ReplaceMatch(arr(i), "\b[E|e]xample\b")
    Next i
End Sub
Public Function ReplaceMatch(ByVal inputString As String, ByVal pattern As String) As String
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Global = True
        .MultiLine = True
        .pattern = pattern

        If .test(inputString) Then
            ReplaceMatch = .Replace(inputString, "replaced")
        Else
            ReplaceMatch = inputString
        End If
    End With
End Function


VBA:

Option Explicit
Public Sub test()
    Dim arr(), i As Long
    arr = Array("One dexamples string", "One example string", "One >example< string", "One Example, string", "One Example string", "One example string")
    For i = LBound(arr) To UBound(arr)
        Debug.Print ReplaceMatch(arr(i), "\b[E|e]xample\b")
    Next i
End Sub
Public Function ReplaceMatch(ByVal inputString As String, ByVal pattern As String) As String
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Global = True
        .MultiLine = True
        .pattern = pattern

        If .test(inputString) Then
            ReplaceMatch = .Replace(inputString, "replaced")
        Else
            ReplaceMatch = inputString
        End If
    End With
End Function
选项显式
公共子测试()
Dim arr(),我只要
arr=Array(“一个dexamples字符串”、“一个示例字符串”、“一个>示例<字符串”、“一个示例字符串”、“一个示例字符串”、“一个示例字符串”)
对于i=LBound(arr)到UBound(arr)
调试.打印替换匹配(arr(i),“\b[E|E]example\b”)
接下来我
端接头
公共函数ReplaceMatch(ByVal inputString作为字符串,ByVal模式作为字符串)作为字符串
作为对象的模糊re
Set re=CreateObject(“VBScript.RegExp”)
带re
.Global=True
.MultiLine=True
.模式
如果.test(inputString),则
ReplaceMatch=.Replace(输入字符串,“已替换”)
其他的
ReplaceMatch=inputString
如果结束
以
端函数

这需要对案例测试进行一些开发:

Option Explicit

Public Sub test()
    Dim arr(), i As Long
    arr = Array("One dexamples string", "One example string", "One >example< string", "One Example, string", "One Example string", "One example string")
    For i = LBound(arr) To UBound(arr)
      Debug.Print ReplaceMatch(arr(i), "\b[E|e]xample\b")
    Next i
End Sub
Public Function ReplaceMatch(ByVal inputString As String, ByVal pattern As String) As String
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Global = True
        .MultiLine = True
        .pattern = pattern

        If .test(inputString) Then
            If AscW(Left$(.Execute(inputString)(0), 1)) < 91 Then
                ReplaceMatch = .Replace(inputString, "Replaced")
            Else
                ReplaceMatch = .Replace(inputString, "replaced")
            End If
        Else
            ReplaceMatch = inputString
        End If
    End With
End Function
选项显式
公共子测试()
Dim arr(),我只要
arr=Array(“一个dexamples字符串”、“一个示例字符串”、“一个>示例<字符串”、“一个示例字符串”、“一个示例字符串”、“一个示例字符串”)
对于i=LBound(arr)到UBound(arr)
调试.打印替换匹配(arr(i),“\b[E|E]example\b”)
接下来我
端接头
公共函数ReplaceMatch(ByVal inputString作为字符串,ByVal模式作为字符串)作为字符串
作为对象的模糊re
Set re=CreateObject(“VBScript.RegExp”)
带re
.Global=True
.MultiLine=True
.模式
如果.test(inputString),则
如果AscW(Left$(.Execute(inputString)(0),1))<91,则
ReplaceMatch=.Replace(输入字符串,“已替换”)
其他的
ReplaceMatch=.Replace(输入字符串,“已替换”)
如果结束
其他的
ReplaceMatch=inputString
如果结束
以
端函数

如果您的大小写变化只涉及单词的第一个字母,那么下面的代码就可以做到这一点

如果单词中的大小写可能是混合的,您需要逐个字母循环,并且还需要决定如果替换的长度与找到的单词的长度不相同,该怎么办

此代码存在一个潜在问题:

  • \b
    是单词边界标记
  • 单词边界定义为一边由单词标记限定,另一边由非单词标记或字符串的开头/结尾限定的位置
  • 单词标记是
    [A-Za-z0-9.]
  • 所以,如果源代码中的字符串以
    \uuu
    (下划线)开头或结尾,将找不到这些字符串
  • 如果这可能是一个问题,我们将不得不更改正则表达式,以及在何处查找“大小写”字符,或者只是暂时用其他非单词字符替换下划线(然后将其更改回原来的位置)


Thanx。但这并不能解决这个例子:一个>例子一个>替换”不是space@Rune就像我在更新的答案中所做的那样,只需添加这个案例。当然,但是有几个特殊字符需要处理。例如:“,./\”?();:&”。这个名单刚刚排到了long.Thanx。这看起来很有希望。我有一个大约1000个单词的列表,这些单词将贯穿整个脚本,并单独替换。因此,我需要将案例作为变量输入进行维护。(如果匹配项为
示例
,则需要更换
更换
)对不起,因此示例=更换,示例=更换?我修改了上述内容。它基于单个匹配检查,但可以很容易地适应循环所有匹配。