Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在特定点拆分文本字符串_Vb.net_Visual Studio 2012 - Fatal编程技术网

Vb.net 在特定点拆分文本字符串

Vb.net 在特定点拆分文本字符串,vb.net,visual-studio-2012,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.T

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

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中的文本

有什么办法可以绕过这一关吗


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

如果jobname和jobnumber永远不包含破折号,那么您可以使用级联索引,最后找到的位置作为下一个位置的开始

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
Dim endOfJobName As Integer=ToCheck.IndexOf(“-”c)
如果endOfJobName为-1,则
'如果需要,请在此处获取jobname
Dim endOfJobNumber As Integer=ToCheck.IndexOf(endOfJobName,“-”c)
如果endOfJobNumber为-1,则
'如果需要,请在此处获取jobnumber
'字符串的其余部分是jobtype
Dim jobType=ToCheck.SubString(endOfJobNumber+1)
如果结束
如果结束

但是,如果jobname或jobnumber可以包含破折号,则除了更改源中的分隔符之外,无法完成大量工作。

您是否可以不使用
将作业作为字符串()进行Dim()=Split(ToCheck,“-”
?注意仪表板周围的空格


如果部分之间的分隔符是空格-破折号-空格,则可以使用其重载来确定要拆分的最大零件数:

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

我假设您无法控制这些文件的格式,因为如果您控制了,则最好将文件格式更改为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
Dim名称、编号、类型为字符串
Dim fileLine As String=“作业-名称-1234-作业-类型”
将regExp变为新的正则表达式((?.*)s-\s(?\d+)\s-\s(?.*))
Dim m As Match=regExp.Match(文件行)
名称=m.Groups(“名称”).值
数字=m.Groups(“数字”).值
类型=m.Groups(“类型”).值

注意:仅当“作业编号”始终为数字时,此选项才有效。如果没有,您可能可以使用更复杂的正则表达式来匹配它。

谢谢,但是“-”中不能有空格@elmonko:谁说的?在我的测试中工作,我链接到的MSDN页面声明:“分隔符:可选。用于标识子字符串限制的任何字符串。如果省略分隔符,则假定空格字符(“”)为分隔符。”