如何在VBScript中的同一字符串的两个索引位置之间存储所有文本?

时间:2018-01-03 04:33:36

标签: asp.net string vbscript

所以我要离开这里的内存,因为我现在看不到我想要解决的代码,但我正在使用一些旧的VB脚本代码,其中有一个如下设置的数据连接:

set objCommand = Server.CreateObject("ADODB.command") 

我有一个来自数据库的字段存储在这样的变量中:

Items = RsData(“Item”).  

数据库中的这个特定字段是一个长字符串 文本:

(即“这是一串文字的一部分......标题一:这是标题之后的文字......标题二:这是标题二之后的更多文字”)。

我希望将文本的某些部分存储为该字段中长文本字符串中两个索引位置之间的变量。它们由存储在上面文本字段中的标题分隔,如下所示:“标题一:”和“标题二:”,我想要捕获这两个文本标题之间发生的所有文本并将它们存储到自己的文本中变量(即“这是标题一后的文字......”)。

我如何实现这一目标?我曾尝试使用InStr方法设置索引,但从我如何理解它的工作方式来看,它只计算字符串特定部分出现的起点。我对此的想法错了吗?既然如此,我也无法让Mid功能正常工作。有人可以告诉我一个如何工作的例子吗?请记住,我只是记忆中的内容所以请原谅我现在无法提供更好的代码示例。我希望我的问题有道理!

我希望今晚有人可以帮我解决问题,所以当我再次接近代码时,明天可以试试这个!感谢您的努力和提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

您可以从文本Header开始提取所有子字符串,并在下一个Header或字符串结尾之前结束。我使用正则表达式来实现它,它对我有用。看看下面的代码。如果我得到一个更简单的(非正则表达式解决方案),我将更新答案。

<强>代码:

strTest = "Header One: Some random text Header Two: Some more text Header One: Some random textwerwerwefvxcf234234 Header Three: Some more t2345fsdfext Header Four: Some randsdfsdf3w42343om text Header Five: Some more text 123213"
set objReg = new Regexp

objReg.Global = true
objReg.IgnoreCase = false
objReg.pattern = "Header[^:]+:([\s\S]*?)(?=Header|$)"      '<---Regex Pattern. Explained later.
set objMatches = objReg.Execute(strTest)
Dim arrHeaderValues()                         '<-----This array contains all the required values
i=-1
for each objMatch in objMatches
    i = i+1
    Redim Preserve arrHeaderValues(i)
    arrHeaderValues(i) = objMatch.subMatches.item(0)      '<---item(0) indicates the 1st group of each match
next

'Displaying the array values
for i=0 to ubound(arrHeaderValues)
    msgbox arrHeaderValues(i)
next
set objReg = Nothing

正则表达式说明:

  • Header - 按字面意思匹配Header
  • [^:]+: - 匹配不是:的任何字符的1次出现。然后匹配:。到目前为止,记住以上两点,我们匹配了Header One:Header Two:Header blabla123:等字符串。现在,此次匹配后的任何内容都与我们相关。因此,我们将在下一次分手中显示的内部捕获。
  • ([\s\S]*?)(?=Header|$) - 匹配并捕获所有内容(包括换行符),直到下一个Header或字符串结尾(由$表示)
    • ([\s\S]*?) - 匹配任何字符的0次出现并捕获第1组中的整个匹配
    • (?=Header|$) - 匹配并捕获上述内容,直到字符串Header的另一个实例或字符串结尾

Click for Regex Demo

替代解决方案(非正则表达式):

strTest = "Header One: Some random text Header Two: Some more text Header One: Some random textwerwerwefvxcf234234 Header Three: Some more t2345fsdfext Header Four: Some randsdfsdf3w42343om text Header Five: Some more text 123213"
arrTemp = split(strTest,"Header")         'Split using the text Header
j=-1
Dim arrHeaderValues()
for i=0 to ubound(arrTemp)                 
    strTemp = arrTemp(i)
    intTemp = instr(1,strTemp,":")        'Find the position of : in each array value
    if(intTemp>0) then
        j = j+1
        Redim preserve arrHeaderValues(j)
        arrHeaderValues(j) = mid(strTemp,intTemp+1)      'Store the desired value in array
    end if
next

'Displaying the array values
for i=0 to ubound(arrHeaderValues)
    msgbox arrHeaderValues(i)
next

如果您不想将值存储在数组中,可以使用Execute语句在运行时创建具有不同名称的变量,并将值存储在其中。请参阅thisthis以供参考。