使用基于 instr 的位置在空格之间提取字符串

Extract string between spaces using location based on instr

全部 - 我被卡住了,需要一些帮助。我有一个字符串,它是最终用户的自由文本字段。我需要从该字段中提取特定的文本字符串。

文本在一个数组中,我已经用 InStr 确认了必要文本的位置,我知道它通常在两侧至少被一个 space 包围。

我正在寻找一种使用 InStr 和 Split 根据位置提取它的方法,但我不确定如何嵌套它们。在我需要的字符串之前或之后的字段中可以有任意数量的 spaces,因为有些人喜欢多余的 spaces。字符串长度通常为 12,但可以更多或更少,因为它是一个自由文本字段。

我愿意接受任何能够提取包含“PO”的字符串的解决方案。

示例字符串:“V000012345 SAPO22-12345 附加信息等等”

If InStr(1, Arr2(j, 10), "PO", 1) > 0 Then
   Arr3(i, 18) = Split(Arr2(j, 10), " ")(??)
End if

这将为您提供包含“PO”的 SPLIT 的第一个元素:

PONumber = Split(arr2(j, 10), " ")(Len(Left(arr2(j, 10), InStr(1, arr2(j, 10), "PO"))) - Len(Replace(Left(arr2(j, 10), InStr(1, arr2(j, 10), "PO")), " ", "")))

这通过计算 PO 之前的空格数并将其用作 SPLIT 的索引来实现。

不过我承认,JvdV 提供的 FILTER 函数为您省去了所有这些麻烦 - 我以前从未见过它以这种方式使用,而且它非常有效。

您可以尝试Filter() the array after Split()。或者,使用正则表达式:

Sub Test()

Dim str As String: str = "V000012345 SAPO22-12345 additional information blah blah"

'Option 1: Via Filter() and Split():
Debug.Print Filter(Split(str), "PO")(0)

'Option 2: Via Regular Expressions:
With CreateObject("vbscript.regexp")
    .Pattern = ".*?\s?(\S*PO\S*).*"
    Debug.Print .Replace(str, "")
End With

End Sub

它是 case-sensitive,以上将 return 第一场比赛。