查找字符串中的所有字符串

Rah*_*hul 1 vbscript vba ms-word

我通过 http 请求响应文本将 StrTxt 作为 html 字符串。我想在 StrTxt 中找到所有出现的 '"string"'。

像这样的东西。

for each string in StrTxt
StrTxt = "all matched strings from StrTxt"
do something StrTxt.
Run Code Online (Sandbox Code Playgroud)

编辑 这被标记为可能重复,但事实并非如此。 如何遍历 word 文档中的每个单词 - VBA 宏解释了如何在文档中查找字符串而不是字符串。

这很简单。如何找到所有带有字符串的字符串?我的标题不是说明了一切吗?

编辑 2

根据 Ansgar Wiechers 的回答,我尝试了以下方法。

Do
i = InStr(strtxt, "startstring")
      If i > 0 Then
        strtxt = Mid(strtxt, i, Len(strtxt) - i)
        i = InStr(InStr(strtxt, "midstring") + 1, strtxt, "endstring")
        If i > 0 Then
         strtxt = Left(strtxt, i + Len(endstring)) ' I am using i+4 as I know the length
        WScript.Echo strtxt
        End If
      End If
Loop While i > 0
Run Code Online (Sandbox Code Playgroud)

它只出现一次。如何正确循环?

Ans*_*ers 5

如果您想使用InStr特定子字符串的所有出现来搜索字符串,您需要重复调​​用该函数,在最后一次匹配后开始每个新搜索(至少)一个字符。

response = "..."  'your HTTP response string
srch     = "..."  'the string you want to find in the response

start = 1
Do
  pos = InStr(start, response, srch, vbTextCompare)
  If pos > 0 Then
    start = pos + 1  'alternatively: start = pos + Len(srch)
    WScript.Echo pos
    WScript.Echo Mid(response, pos, Len(srch))
  End If
Loop While pos > 0
Run Code Online (Sandbox Code Playgroud)

如果您希望比较区分大小写,请替换vbTextComparevbBinaryCompare.


编辑:要查找以某个字符串开头、包含另一个字符串并以第三个字符串结尾的模式,最好使用正则表达式@TylerStandishMan已经在他的回答中展示了基本原则,但是在您的场景中需要注意一些事项。

response = "..."  'your HTTP response string

startTerm = "startstring"
midTerm   = "midstring"
endTerm   = "endstring"

Set re = New RegExp
re.Pattern    = startTerm & "[\s\S]*?" & midTerm & "[\s\S]*?" & endTerm
re.Global     = True
re.IgnoreCase = True  'if required

For Each m In re.Execute(response)
  WScript.Echo m
Next
Run Code Online (Sandbox Code Playgroud)

正则表达式中的某些字符具有特殊含义(例如.匹配除换行符之外的任何字符),因此您需要确保开始、中间和结束术语中的任何此类字符都已正确转义(例如\.用于匹配文字点)。如果您要匹配的子字符串跨越多行,您需要匹配搜索词之间的任意文本的表达式部分以包含换行符(例如[\s\S]匹配任何空白或非空白字符)。您可能还想让匹配变得非贪婪,否则您将获得从 的第一次出现startTerm到最后一次出现的单个匹配endTerm。这就是修饰符*?的用途。