在特定点拆分文本字符串

时间:2014-10-07 19:31:56

标签: vb.net visual-studio-2012

我有一个树视图,其中树节点是从文本文件中的文本生成的。标准布局是: -

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

关于如何绕过这个

的任何想法

如果您需要更多信息,我可以更新帖子....

4 个答案:

答案 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, " - ")?注意破折号周围的空格。

Split

答案 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 " - ")