如何使用substring()函数获取具有相对索引的中间字符串?

时间:2019-05-23 10:26:51

标签: vb.net visual-studio substring

我想从字符串中提取字符。但是,字符串并非每次都具有相同的长度。

基本上,我从数据库中获取数据,并且想要提取其中需要的值。但是我陷入了必须提取正确值的步骤。

所以首先我得到这样的数据:

 infoDataset2 = accessRequet_odbc("select st_astext(st_snaptogrid(geom, 0.01)) from netgeo_point_tech", myConnection)

结果类似于:POINT(921021.98 6671778.45)。我需要的是2个数字,但是它们的长度不是固定的。我只想删除POINT()

然后我在DataSet的每一行上工作,将每行都转换为仅包含所需值的字符串。

For i = 0 To infoDataset2.Tables(0).Rows.Count - 1
            geomPt = infoDataset2.Tables(0).Rows(i).ItemArray(0).Substring(geomPt = infoDataset2.Tables(0).Rows(i).ItemArray(0).Substring(1 + infoDataset2.Tables(0).Rows(i).ItemArray(0).LastIndexOf("(")))

            Console.WriteLine(geomPt)
        Next

这是我的最后一次尝试,在那里我可以移除POINT(,但是我在削减)的长度上苦苦挣扎。

我想从中学到东西,所以,如有可能,请向我解释我在这里做错了什么,或者我的方法缺乏见识。

3 个答案:

答案 0 :(得分:2)

调试那条长线将是可怕的。如果将计算机分成易于阅读的部分,则对计算机没有影响。这是一些代码,可从问题所示格式的字符串中获取x和y坐标:

Dim s = "POINT(921021.98 6671778.45)"
Dim b1 = s.IndexOf("("c) + 1
Dim b2 = s.IndexOf(")"c, b1) - 1
Dim parts = s.Substring(b1, b2 - b1 + 1).Split({" "c})
Dim x As Decimal = Decimal.Parse(parts(0))
Dim y As Decimal = Decimal.Parse(parts(1))

解析字符串的另一种方法是使用regular expression,它可以更加灵活。在此示例中,我使用命名捕获组来轻松查看x和y的哪些部分:

Dim s = "POINT(921021.98 6671778.45)"

Dim x As Decimal
Dim y As Decimal

Dim re = New Regex("\((?<x>[0-9-.]+) (?<y>[0-9-.]+)\)")
Dim m = re.Match(s)
If m.Success Then
    x = Decimal.Parse(m.Groups("x").Value)
    y = Decimal.Parse(m.Groups("y").Value)
Else
    ' Could not parse point. Do something about it if required.
End If

答案 1 :(得分:1)

安德鲁·莫顿(Andrew Morton)给出了一个很好的答案,我赞成这样做,如果您需要一种更简单的方法并且使用此方法仍然很复杂

    Dim s = "POINT(921021.98 6671778.45)"

    Dim part1 As String = s.Remove(0, 6)
    Dim part2 As String = part1.Substring(0, part1.Length - 1)
    Dim split() As String = part2.Split(" ")

    Dim x = split(0)
    Dim y = split(1)

答案 2 :(得分:0)

这是一个甚至可能更容易理解的解决方案:

Dim s as String = "POINT(921021.98 6671778.45)"
Dim coordinate() as String = s.Replace("POINT(", "").Replace(")", "").Split(" ") 

享受!