繁体   English   中英

Excel VBA 字边界(替换介词)

[英]Excel VBA word boundaries (replacing prepositions)

我需要做的是在单元格中的每个介词之前添加一个加号+号? 出于某种原因, \\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

我想我得到了一个提示。 看起来这个正则表达式适用于拉丁字符,但对于西里尔文,它不返回匹配项。 我已经更新了示例。

至于西里尔字符,你应该知道,根据Regular-expressions.info ,VBScript regex 有

不支持 Unicode,除了匹配单个字符

所以, \\b在非单词边界匹配,西里尔字母是 VBScript 正则表达式引擎的非单词!

唯一的出路是像这样扩展\\b ,例如:

strPattern = "(\s|^)(от|для)(\s|$)" 
str = "Отдохнуть от них было для него спасением от мук и прекрасным отдыхом."
strReplace = "$1+$2$3"

我认为我们可以安全地使用空格作为分隔符,因为介词后面通常没有标点符号。 您可以在第一部分添加标点符号(以防万一):

strPattern = "([\s,:;]|^)(от|для)(\s|$)" 

输出:

Отдохнуть +от них было +для него спасением +от мук и прекрасным отдыхом.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM