我需要做的是在单元格中的每个介词之前添加加号+
符号?出于某种原因,\b
对我不起作用。
在JavaScript中,它应该可以正常工作:
(\bof\b|\bat\b)
//change with
+$1
但Excel中使用相同正则表达式的VBA脚本将无法匹配任何内容。
示例:
И отдохнуть от них было для него спасением от мук.
结果应为:
И отдохнуть +от них было +для него спасением +от мук.
请注意,“отдохнуть”字样内有“от”。
代码本身(在这里采取的地方):
Sub ReplaceWithRe()
Dim re As Object 'RegExp
Dim rng As Range, cl As Range
Dim sh As Worksheet
Dim wb As Workbook
Dim sReplace As String
Dim aReplace(0 To 1, 0 To 1) As String
Dim i As Long
Set wb = ActiveWorkbook
Set re = CreateObject("vbscript.regexp") ' New RegExp
re.Global = True
re.IgnoreCase = False
re.MultiLine = True
' Load array of patterns and replacements
aReplace(0, 0) = "(\bот\b|\bдля\b)"
aReplace(0, 1) = "+$1"
For Each sh In wb.Worksheets
On Error Resume Next
Set rng = sh.UsedRange.SpecialCells(xlCellTypeConstants)
If Err.Number <> 0 Then
Err.Clear
Else
On Error GoTo 0
For Each cl In rng
sReplace = cl.Value
' Test each cell for each pattern, replace when found
For i = 0 To UBound(aReplace, 1)
re.Pattern = aReplace(i, 0)
If re.Test(sReplace) Then
sReplace = re.Replace(sReplace, aReplace(i, 1))
End If
Next
cl.Value = sReplace
Next
End If
Next
End Sub
我想我得到了一个暗示。看起来这个正则表达式适用于拉丁字符,但是使用Cyrillic它没有返回匹配。我已经更新了示例。
答案 0 :(得分:1)
至于西里尔字符,你应该知道,根据Regular-expressions.info,VBScript正则表达式
除了使用
匹配单个字符外,不支持Unicode
因此,\b
匹配非字边界,西里尔字母是VBScript正则表达式引擎的非字!
唯一的出路是像这样扩展\b
,例如:
strPattern = "(\s|^)(от|для)(\s|$)"
str = "Отдохнуть от них было для него спасением от мук и прекрасным отдыхом."
strReplace = "$1+$2$3"
我认为我们可以安全地使用空格作为分隔符,因为介词通常不会跟着标点符号。您可以在第一部分添加标点符号(以防万一):
strPattern = "([\s,:;]|^)(от|для)(\s|$)"
输出:
Отдохнуть +от них было +для него спасением +от мук и прекрасным отдыхом.