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

VB6从字符串中删除文本直到字符,vb6,Vb6,我正在用VB6制作一个程序来整理我的文件。通过几个按钮,我可以选择一个类别。很多文件的文件名前面都有一个数字 示例:1111-FILENAME或12-FILENAME 我一直在尝试使用拆分功能: filename.Text = Split(filename.Text, "-")(1) 但是,如果文件名中有更多的-字符,则这不起作用。它应该从左边开始查看-,然后停止并删除那些字符,包括-。因此,我只剩下文件名。Split()在这种情况下没有多大帮助。我想您可以随后使用Join()重新连接Spli

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

示例:
1111-FILENAME
12-FILENAME

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

filename.Text = Split(filename.Text, "-")(1)
但是,如果文件名中有更多的
-
字符,则这不起作用。它应该从左边开始查看
-
,然后停止并删除那些字符,包括
-
。因此,我只剩下
文件名

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


有一个比Mark的简单得多的解决方案(对不起,Mark,您的解决方案比这更有效,但仍然符合OP的要求):

将返回“MYFILENAME.EXT”

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

Right("1321-3435-MYFILENAME.EXT", 24-10)
这也将返回“MYFILENAME.EXT”

[编辑]

马克对OP要求的解释与我的不同。(现在所述的要求与OP的原始要求不同;Mark已对其进行了编辑以符合其解释。我们将看看OP是否澄清。)我理解他想解释文件名前字符串中的多个破折号,Mark理解他想解释文件名中的多个破折号

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

example = "1321-MY-FILE-NAME.EXT"
Debug.Print Right(example, Len(example) - InStr("example", "-"))
这将返回“MY-FILE-NAME.EXT”


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

很抱歉误解!:D

我想在“我的文件名”中保留“-”。仅删除前导字符(如果有)

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

谢谢你们两位的帮助。我现在有事情要处理,可以继续。总是发现很难操纵字符串。但我正在学习


Bob

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

尝试以下方法:

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
Dim myRegExp作为RegExp
将myMatches设置为MatchCollection
把我的火柴当作火柴
设置myRegExp=newregexp
myRegExp.IgnoreCase=True
myRegExp.Global=True
myRegExp.Pattern=“^(?(\d+-)+)。+$”
Set myMatches=myRegExp.Execute(subjectString)
对于myMatches中的每个myMatches
MsgBox(myMatch.Value)
下一个
有关正则表达式的说明,请参见:

我记得vb6在命名捕获组时遇到问题,因此您可能必须使用“^(?(\d+-)+).+$”这只是一个捕获组,因此您可以通过myMatch.groups[0].Value中的索引访问结果

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

始终使用正则表达式:)

问候
SLimke

反例:“24323-A-FILENAME-WITH-OTHER-DASHES.EXT”好吧,当然,现在您已经编辑了OP的帖子,以更改他的要求,从而使我的解决方案无法运行。也许他没有提到他需要解释文件名中的破折号。我们会看到……我相信您说过,您的文件名前面总是紧跟着一个破折号,就像在您的两个示例中一样,但是文件名前面的浪费字符有时会有另一个破折号。然而,马克编辑了你的文章,暗示你的文件名中可能也有破折号,大概是因为我的解决方案没有考虑到这一点。请澄清是否需要解释文件名中的破折号。@BobRodes我已经看过我的编辑,这似乎是更合理的解释。在QWERTY键盘上,“f”和“r”键非常接近,这是一种非常常见的打字错误。另外,示例:1111-FILENAME的12-FILENAME看起来像两个项目,而不是一个。不管怎样,正如您所说,user3586368有责任确认或拒绝:-)如果我们假设OP询问的是文件名中的多个破折号,而不是它前面的字符串中的多个破折号,那么效率会更高。仔细看看你的解决方案,它没有考虑到这种可能性,而我的解决方案没有考虑到文件名中有破折号的可能性。你修改了他的要求,以牺牲我的利益来陈述你的解释,但实际上我们都不知道OP想要什么。如果他回应我的澄清请求,我们将看看他有什么要说的。
example = "1321-MY-FILE-NAME.EXT"
Debug.Print Right(example, Len(example) - InStr("example", "-"))
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