如何模仿正则表达式负向回顾?

How to mimic regular Expression negative lookbehind?

我想要完成的事情

我正在尝试创建一个函数以在 VBA 中使用字符串插值。我遇到的问题是我不确定如何用 vbNewLine 替换“\n”,只要它前面没有转义字符“\”?


我发现并尝试过的

据我所知,VBScript 没有消极的一面。

下面有两个我已经尝试过的模式示例:

Private Sub testingInjectFunction()
    Dim dict As New Scripting.Dictionary
    dict("test") = "Line"
    Debug.Print Inject("${test}1\n${test}2 & link: C:\notes.txt", dict)
End Sub    
Public Function Inject(ByVal source As String, dict As Scripting.Dictionary) As String
    Inject = source

    Dim regEx As Object
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Global = True

    ' PATTERN # 1 REPLACES ALL '\n'
    'regEx.Pattern = "\n"

    ' PATTERN # 2 REPLACES EXTRA CHARACTER AS LONG AS IT IS NOT '\'
    regEx.Pattern = "[^\]\n"

    ' REGEX REPLACE
    Inject = regEx.Replace(Inject, vbNewLine)

    ' REPLACE ALL '${dICT.KEYS(index)}' WITH 'dICT.ITEMS(index)' VALUES
    Dim index As Integer
    For index = 0 To dict.Count - 1
        Inject = Replace(Inject, "${" & dict.Keys(index) & "}", dict.Items(index))
    Next index

End Function

想要的结果

Line1
Line2 & link: C:\notes.txt

模式 #1 的结果:(不需要时替换)

Line1
Line2 & link: C:\
otes.txt

模式 # 2 的结果:(替换 'Line1' 中的 1)

Line
Line2 & link: C:\notes.txt

总结题

我可以很容易地编写不使用正则表达式的代码来实现我想要的目标,但想看看 VBA 中是否有正则表达式的方法。

如何使用 VBA 中的正则表达式将“\n”替换为 vbNewLine,只要它前面没有转义字符“\”?

是的,您可以在此处使用正则表达式。由于在这些字符串中不使用反斜杠对自身进行转义,因此您可以像这样修改您的解决方案:

regEx.Pattern = "(^|[^\])\n"
S = regEx.Replace(S, "" & vbNewLine)

它将匹配并捕获除 \n 之前的 \ 之外的任何字符,然后将其与 </code> 占位符一起放回去。由于 <code>\n 有可能出现在字符串的开头,因此 ^ - 字符串锚点的开头 - 作为替代项添加到捕获组中。

图案详情

  • (^|[^\]) - 捕获第 1 组:字符串开头 (^) 或 (|) 除反斜杠 ([^\])
  • 之外的任何字符
  • \ - 反斜杠
  • n - 一个 n 字符。