我正在用VB6制作程序来整理我的文件。只需几个按钮,我就可以选择一个类别。很多这些文件在文件名前都有一个数字
示例:1111-FILENAME
或12-FILENAME
我一直在尝试使用拆分功能:
filename.Text = Split(filename.Text, "-")(1)
但如果文件名中有更多-
个字符,则无效。它应该从左侧开始查看-
,然后停止并删除包括-
在内的字符。所以我只剩下FILENAME
。
答案 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)
我想在“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