VB.net获取两个字符串之间的字符串返回错误或错误的值

时间:2018-03-08 18:39:45

标签: regex vb.net

我有一个很长的字符串。在这个字符串中,有我要解析的字符串。 解析后,我将值传递给listview。 它已经工作了,但我一直在努力争取一个字符串.. 这是一张图片:

Here you can see, that the second value is wrong

我正在使用此字符串:

  

UserToken:8VE91632C25166906Amount:5.00Accounts:10buyTime:二零一八年二月二十零日   12:16:56untilTime:2018年3月22日   12:16:56EndBREAKUserToken:2BB32950CL297560CAmount:25.00Accounts:50buyTime:2018年2月21日   13:05:52untilTime:2018年3月23日   13:05:52EndBREAKUserToken:8S034548J4871372YAmount:30.00Accounts:60buyTime:2018年2月21日   15:26:28untilTime:2018年3月23日   15:26:28EndBREAKUserToken:84692313143307443Amount:60.00Accounts:120buyTime:2018年2月22日   11:33:54untilTime:2018年3月24日   11:33:54EndBREAKUserToken:3JJ04496CB952290AAmount:30.00Accounts:60buyTime:2018年2月23日   19:28:42untilTime:2018年3月25日   19:28:42EndBREAKUserToken:9K197884LF5914344Amount:60.00Accounts:120buyTime:2018年2月27日   17:07:16untilTime:2018年3月29日   17:07:16EndBREAKUserToken:28C99011N17519701Amount:135.00Accounts:180buyTime:2018年3月5日   09:00:00untilTime:2018年4月5日   09:00:00EndBREAKUserToken:0TD98762R1733752EAmount:225.00Accounts:300buyTime:2018年3月7日   19:00:00until时间:2018-04-07 20:00:00EndBREAK

这就是我解析值的方式:

 Dim words() As String
        Dim space() As Char = {"BREAK"}
        words = STRINGABOVE.Split(space)
        Dim word As String


        For Each word In words


            Try
                Dim sSource As String = word
                Dim sDelimStart As String = "UserToken:"
                Dim sDelimEnd As String = "Amount:"
                Dim nIndexStart As Integer = sSource.IndexOf(sDelimStart)
                Dim nIndexEnd As Integer = sSource.IndexOf(sDelimEnd, nIndexStart + sDelimStart.Length + 1)

                Dim sDelimStart2 As String = "Amount:"
                Dim sDelimEnd2 As String = "Accounts:"
                Dim nIndexStart2 As Integer = sSource.IndexOf(sDelimStart2)
                Dim nIndexEnd2 As Integer = sSource.IndexOf(sDelimEnd2, nIndexStart2 + sDelimStart2.Length + 1)

                Dim sDelimStart3 As String = "Accounts:"
                Dim sDelimEnd3 As String = "buyTime:"
                Dim nIndexStart3 As Integer = sSource.IndexOf(sDelimStart3)
                Dim nIndexEnd3 As Integer = sSource.IndexOf(sDelimEnd3, nIndexStart3 + sDelimStart3.Length + 1)

                Dim sDelimStart4 As String = "buyTime:"
                Dim sDelimEnd4 As String = "untilTime:"
                Dim nIndexStart4 As Integer = sSource.IndexOf(sDelimStart4)
                Dim nIndexEnd4 As Integer = sSource.IndexOf(sDelimEnd4, nIndexStart4 + sDelimStart4.Length + 1)

                Dim sDelimStart5 As String = "untilTime:"
                Dim sDelimEnd5 As String = "End"
                Dim nIndexStart5 As Integer = sSource.IndexOf(sDelimStart5)
                Dim nIndexEnd5 As Integer = sSource.IndexOf(sDelimEnd5, nIndexStart5 + sDelimStart5.Length + 1)

                Dim res As String = Strings.Mid(sSource, nIndexStart + sDelimStart.Length + 1, nIndexEnd - nIndexStart - sDelimStart.Length)
                Dim res2 As String = Strings.Mid(sSource, nIndexStart2 + sDelimStart2.Length + 1, nIndexEnd2 - nIndexStart2 - sDelimStart2.Length)
                Dim res3 As String = Strings.Mid(sSource, nIndexStart3 + sDelimStart3.Length + 1, nIndexEnd3 - nIndexStart3 - sDelimStart3.Length)
                Dim res4 As String = Strings.Mid(sSource, nIndexStart4 + sDelimStart4.Length + 1, nIndexEnd4 - nIndexStart4 - sDelimStart4.Length)
                Dim res5 As String = Strings.Mid(sSource, nIndexStart5 + sDelimStart5.Length + 1, nIndexEnd5 - nIndexStart5 - sDelimStart5.Length)

                ListView1.Items.Add(New ListViewItem({res, res2, res3, res4, res5}))

            Catch
            End Try
        Next

我解析的第二个字符串的结果总是“7560C”,所以它只是字符串的一部分..其他值是正确的。此外,当我将此字符串设置为另一个字符串,如“8VE91632C25166906”时,它向我显示整个字符串。还有正则表达式我不能得到完整的字符串..问题在哪里?这让我抓狂......

最好的问候..

2 个答案:

答案 0 :(得分:1)

以下表达式将匹配您指定的字符串中的所有实例:

表达式:

UserToken:([A-Z0-9]{17})Amount:(\d+\.\d+)Accounts:(\d+)buyTime:(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})untilTime:(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})EndBREAK

代码(自动生成,您可能需要调整它):

Dim AllMatchResults As MatchCollection
Try
    Dim RegexObj As New Regex("UserToken:([A-Z0-9]{17})Amount:(\d+\.\d+)Accounts:(\d+)buyTime:(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})untilTime:(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})EndBREAK")
    AllMatchResults = RegexObj.Matches(SubjectString)
    If AllMatchResults.Count > 0 Then
        ' Access individual matches using AllMatchResults.Item[]
    Else
        ' Match attempt failed
    End If
Catch ex As ArgumentException
    'Syntax error in the regular expression
End Try

Check the expression online (click the Table tab)

答案 1 :(得分:0)

您正在TokenAmount:之间寻找某事 所以正则表达式 (?<=Token\:)(.*?)(?=Amount\:)
会匹配你要找的东西。
说明
  (?<=Token\:):它看起来是后面的,所以只有当'Token:'出现在它之后的表达式之前时,你在此之后写的表达式才匹配
  (.*?):使用换行符匹配之外的每个字符。所以,你可以匹配任何东西,你需要多少次,直到它找到你在(.*?)之后写的东西(即匹配将在字符串'Amount:',如果在当前匹配之前找到)停止。
  (?=Amount\:):这是一个展望未来。除了在
上一个匹配的表达式之后它寻找'Amount'右之外,以完全相同的方式工作。

我不知道如何用你试图解决问题的另一种方式来帮助你,但希望一旦你说你尝试了正则表达式就满足了你(因此我推断你愿意使用它们:))。