REGEX捕获两个字符串之间的所有单词

时间:2014-12-03 16:23:32

标签: regex vba vbscript

使用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

3 个答案:

答案 0 :(得分:3)

如果您尝试独立捕获每个单词,则需要两个步骤。

获取

之间的全文

Multiline,Global

while(

^Logs:([\S\s]*?)^WORKSTATION#  


{

split on whitespace, the string returned in capture group 1.  

}

答案 1 :(得分:1)

^[\s\S]*?Logs:|WORKSTATION[\s\S]*$|\n

尝试{。{1}}替换。请参阅演示。

http://regex101.com/r/yR3mM3/39

答案 2 :(得分:0)

为什么不首先捕获整个单词列表然后解析呢?

objRegEx.Pattern = ":\s*([\S\s]*)\s?WORKSTATION#"

然后,你的oRegResults将包含1个字符串,其中包含你可以调用的所有单词(分隔符为换行符)以获取数组中的单词。