Excel VBA-字符串替换-reg exp?
我正在Excel VBA中进行一些单词替换。替换由任何特殊字符(a-z、a-z、0-9除外)分隔的单词本身,并保留大小写 正确更换的示例(将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
示例
替换为替换
):
一个示例字符串
一个替换字符串
一个示例字符串
一个替换字符串
一个示例,字符串
一个替换,字符串
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个单词的列表,这些单词将贯穿整个脚本,并单独替换。因此,我需要将案例作为变量输入进行维护。(如果匹配项为示例
,则需要更换更换
)对不起,因此示例=更换,示例=更换?我修改了上述内容。它基于单个匹配检查,但可以很容易地适应循环所有匹配。