VB6从字符串中删除文本直到字符

时间:2014-04-29 17:47:05

标签: vb6

我正在用VB6制作程序来整理我的文件。只需几个按钮,我就可以选择一个类别。很多这些文件在文件名前都有一个数字

示例:1111-FILENAME12-FILENAME

我一直在尝试使用拆分功能:

filename.Text = Split(filename.Text, "-")(1)

但如果文件名中有更多-个字符,则无效。它应该从左侧开始查看-,然后停止并删除包括-在内的字符。所以我只剩下FILENAME

4 个答案:

答案 0 :(得分:2)

Split()在这种情况下不是很有帮助。我想您可以随后使用Join()重新加入您感兴趣的Split()返回的数组部分。但是找到第一个破折号然后撕掉它会更有效率短划线两侧的琴弦。可以使用以下函数执行此操作:

Function GetNumberAndFileNameFromValue(ByRef in_sValue As String, ByRef out_sNumber As String, ByRef out_sFileName As String) As Boolean

    Dim lLastDash   As Long

    lLastDash = InStr(1, in_sValue, "-")
    If lLastDash > 0 Then
        out_sNumber = Left$(in_sValue, lLastDash - 1)
        out_sFileName = Mid$(in_sValue, lLastDash + 1)
        GetNumberAndFileNameFromValue = True
    Else
        GetNumberAndFileNameFromValue = False
    End If

End Sub

如果需要,此通用函数将允许您获取这两个值。如果您只想要文件名,可以创建另一个包装器:

Function GetFileNameFromValue(ByRef in_sValue As String) As String
    GetNumberAndFileNameFromValue in_sValue, vbNullString, GetFileNameFromValue
End Function

e.g。

Debug.Print GetFileNameFromValue("1111-FILENAME-WITH-LOTS-OF-DASHES")

答案 1 :(得分:0)

有一个比Mark更简单的解决方案(对不起Mark,你的工作并做的不仅仅是这个,但是,这仍然是OP所要求的):

example = "1321-3435-MYFILENAME.EXT"
Debug.Print Right(example, Len(example) - InStrRev("example", "-"))

将返回“MYFILENAME.EXT”。

我会把它分解。 Len(string)返回字符串的长度,在本例中为24. InStrRev(string,charmatch)返回从右侧开始在字符串中找到的第一个charmatch的位置(从左边开始,这可能会令人困惑)。在这种情况下是10.右(字符串,x)采用字符串最右边的x个字符。使用Right函数和插入其他函数的数字将使解决方案更加明显:

Right("1321-3435-MYFILENAME.EXT", 24-10)

这也将返回“MYFILENAME.EXT”。

<强> [编辑]

Mark对OP的要求的解释与我的不同。 (现在提出的要求与OP的原始要求不同; Mark编辑了它们以符合他的解释。我们将看看OP是否澄清。)我明白他想在字符串前面加上多个破折号文件名,马克明白他想在文件名中记录多个破折号

现在,即使我们认为Mark的解释是正确的,我们仍然可以通过使用InStr而不是InStrRev来简化他的解决方案:

example = "1321-MY-FILE-NAME.EXT"
Debug.Print Right(example, Len(example) - InStr("example", "-"))

这将返回“MY-FILE-NAME.EXT”。

基本上,我的第一个代码示例返回字符串中最右边的短划线右侧的所有字符。替换InStr将返回字符串中最左侧短划线右侧的所有字符。

答案 2 :(得分:0)

抱歉这个误会! :d

我想在“MY-FILE-NAME”中保留“ - ”。只删除前导字符(如果有)。

所以“1321-MY-FILE-NAME.EXT”应为:“MY-FILE-NAME.EXT”。 我没有文件:“1321-1234-MY-FILE-NAME.EXT”。所以这不是问题。

谢谢你们的帮助。我现在有一些工作可以继续。总是发现很难操纵字符串。但我正在学习。

鲍勃

答案 3 :(得分:0)

在我看来,字符串操作应该总是,总是,总是完成正则表达式。它们易于创建,易于阅读(是的,你是对的,直到达到一些复杂性 g

尝试类似:

Dim myRegExp As RegExp
Dim myMatches As MatchCollection
Dim myMatch As Match

Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "^(?<numbers>(\d+-)+).+$"
Set myMatches = myRegExp.Execute(subjectString)

For Each myMatch in myMatches
  MsgBox(myMatch.Value)
Next

正则表达式的说明可以在http://regex101.com/

下看到

我想我记得vb6在命名捕获组时遇到问题所以你可能不得不使用“ ^(?:( \ d + - )+)。+ $ ”这只是一个捕获组,所以你可以通过 myMatch.Groups [0] .Value 中的索引来访问结果。

希望这有助于获得有关如何在vb6或一般情况下使用字符串的一些新想法。

始终使用正则表达式:)

问候 SLimke