如何模仿正则表达式负向回顾?
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
字符。
我想要完成的事情
我正在尝试创建一个函数以在 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
字符。