使用VBScript或VBA我试图写一个REGEX查询来捕获两个特定字符串值之间的所有单词。
条件: 多线,全球
我试图捕获'日志之间的所有单词:'和'工作站#'字符串
测试字符串:
show access-log log brief
Logs:
main
streaming
ssl
cifs
mapi
im
p2p
WORKSTATION#(config)show
预期结果:
main, streaming, ssl, cifs, mapi, im, p2p
我目前的非工作代码:
Function GetLogList()
Dim strInput, objRegEx, oRegResults
Dim X, Y, Z
strInput = "show access-log log brief" & vbCrLf & _
"Logs:" & vbCrLf & _
"main" & vbCrLf & _
"streaming" & vbCrLf & _
"ssl" & vbCrLf & _
"cifs" & vbCrLf & _
"mapi" & vbCrLf & _
"im" & vbCrLf & _
"p2p" & vbCrLf & _
"WORKSTATION#(config)show"
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.MultiLine = True
objRegEx.Global = True
'Need Help with pattern
objRegEx.Pattern = ":\s*(\S*)\s*?WORKSTATION#"
Set oRegResults = objRegEx.Execute(strInput)
For X = 0 To oRegResults.Count - 1
Debug.Print oRegResults(X).Value
For Y = 0 To oRegResults(X).SubMatches.Count - 1
If oRegResults(X).SubMatches(Y) <> vbNullString Then
Debug.Print oRegResults(X).SubMatches(Y)
End If
Next
Next
End Function
我非常感谢我的REGEX模式的任何帮助,以捕获:和WORKSTATION#之间的所有单词。谢谢!
编辑:
感谢您的建议。我有一圈并没有想到这一点。我原以为我的实际字符串会有额外的空格,但事实证明,下面的工作很好地捕获整个字符串并通过vbCrLf进行拆分。感谢所有帮助过的人。
最终例程:
Function GetLogListArray(strInput)
Dim objRegEx, oRegResults
GetLogListArray = vbNullString
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.MultiLine = True
objRegEx.Global = True
objRegEx.Pattern = "Logs\:\s*([\S\s]*?)\s*?\S*?#"
Set oRegResults = objRegEx.Execute(strInput)
If oRegResults.Count = 0 Then Exit Function
If oRegResults(0).Submatches.Count = 0 Then Exit Function
GetLogListArray = Split(oRegResults(0).Submatches(0), vbCrLf)
End Function
答案 0 :(得分:3)
如果您尝试独立捕获每个单词,则需要两个步骤。
获取
之间的全文Multiline,Global
while(
^Logs:([\S\s]*?)^WORKSTATION#
)
{
split on whitespace, the string returned in capture group 1.
}
答案 1 :(得分:1)
答案 2 :(得分:0)
为什么不首先捕获整个单词列表然后解析呢?
objRegEx.Pattern = ":\s*([\S\s]*)\s?WORKSTATION#"
然后,你的oRegResults将包含1个字符串,其中包含你可以调用的所有单词(分隔符为换行符)以获取数组中的单词。