正则表达式负面看后方

时间:2018-03-30 21:51:58

标签: regex vba negative-lookbehind

如何在VBA中使用正则表达式将“\ n”替换为vbNewLine,只要它之前没有“\”?就我的研究而言,VBScript背后没有负面看法。

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

Private Sub tester()

    Dim Dict As New Dictionary
    Dict("test") = "Line"
    Debug.Print StringTemplate("${test}1\n${test}2 & link: C:\\notes.txt", Dict)

End Sub

Public Function StringTemplate(S As String, Dict As Dictionary) As String

    Dim i As Integer
    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
    S = regEx.Replace(S, vbNewLine)

    ' REPLACE ALL '${DICT.KEYS(i)}' WITH 'DICT.ITEMS(I)' VALUES
    For i = 0 To Dict.Count - 1
        S = Replace(S, "${" & Dict.Keys(i) & "}", Dict.Items(i))
    Next i
    StringTemplate = S

End Function

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

  

线路1

     

Line2&链接:C:\

     

otes.txt

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

  

     

Line2&链接:C:\\ notes.txt

我可以轻松编写不使用可以达到我预期目标的正则表达式的代码,但是想看看VBA中是否有正则表达式的方法?

1 个答案:

答案 0 :(得分:1)

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

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

它会在\之前匹配并捕获\n之前的任何字符,然后将其与$1占位符一起放回。由于\n有可能出现在字符串的开头,^ - 字符串锚点的开头 - 作为替代方式添加到捕获组中。

模式详情

  • (^|[^\\]) - 捕获第1组:字符串开头(^)或(|)任何字符,但反斜杠([^\\]
  • \\ - 反斜杠
  • n - n字符。