我有一个树视图,其中树节点是从文本文件中的文本生成的。标准布局是: -
jobname - jobnumber - jobtype(在“ - ”之间有空格)
对于操作的一部分,我需要将此字符串拆分为3个部分,为此我使用LastIndexOf("-"c)
并使用“Microsoft.VisualBasic.Mid”函数将其拆分
Private Sub Job_Select_Load(sender As Object, e As EventArgs) Handles MyBase.Load
tbJobName.Text = Main.tvProgress.SelectedNode.Text
Dim enUK As New CultureInfo("en-GB")
Dim ToCheck As String = tbJobName.Text
Dim index1 As Integer = ToCheck.LastIndexOf("-"c)
Dim jCode As String = Microsoft.VisualBasic.Trim(Microsoft.VisualBasic.Mid(ToCheck, index1 - 5, 5))
Dim jOps As String = Microsoft.VisualBasic.Trim(Microsoft.VisualBasic.Mid(ToCheck, index1, 10))
我遇到的问题是jobtype
在文本中还包含“ - ”,然后将所有内容抛出。我尝试使用IndexOf
切换它,但偶尔jobname
会包含' - '
我无法控制jobname中的文本 - jobnumber - jobtype
关于如何绕过这个
的任何想法如果您需要更多信息,我可以更新帖子....
答案 0 :(得分:1)
我假设您无法控制这些文件的格式,因为如果您这样做,将文件格式更改为XML或至少是CSV文件格式会更好。
如果作业名称和类型中都有无限数量的短划线,则只要数字不变,就可以使用正则表达式查找组。它看起来像这样:
Dim name, number, type As String
Dim fileLine As String = "job - name - 1234 - job - type"
Dim regExp As New Regex("(?<name>.*)\s-\s(?<number>\d+)\s-\s(?<type>.*)")
Dim m As Match = regExp.Match(fileLine)
name = m.Groups("name").Value
number = m.Groups("number").Value
type = m.Groups("type").Value
注意:仅当“作业编号”始终为数字时才有效。如果没有,您可能可以使用更复杂的正则表达式匹配它。
答案 1 :(得分:0)
如果jobname和jobnumber永远不会包含破折号,那么你可以使用级联的IndexOfs,最后找到的位置作为下一个的开头。
Dim endOfJobName As Integer = ToCheck.IndexOf("-"c)
If endOfJobName <> - 1 Then
' Get jobname here if needed
Dim endOfJobNumber As Integer = ToCheck.IndexOf(endOfJobName, "-"c)
If endOfJobNumber <> -1 Then
' Get jobnumber here if needed
' The remainder of the string is jobtype
Dim jobType = ToCheck.SubString(endOfJobNumber + 1)
End If
End If
但是,如果jobname或jobnumber可以包含破折号,除了更改源中的分隔符之外,没有太多可以完成的事情。
答案 2 :(得分:0)
你能否使用Dim job As String() = Split(ToCheck, " - ")
?注意破折号周围的空格。
答案 3 :(得分:0)
如果部分之间的分隔符是空格 - 空格,那么您可以使用String.Split的重载来确定要将其拆分为的最大部分数:
Dim s = "job-name - jobnumber - jobtype (with the spaces in between the "" - "")"
Dim parts As String() = s.Split(New String() {" - "}, 3, StringSplitOptions.None)
Console.WriteLine("name: " & parts(0).Trim())
Console.WriteLine("number: " & parts(1).Trim())
Console.WriteLine("type: " & parts(2).Trim())
输出:
name: job-name
number: jobnumber
type: jobtype (with the spaces in between the " - ")