我有一个很长的字符串。在这个字符串中,有我要解析的字符串。 解析后,我将值传递给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”时,它向我显示整个字符串。还有正则表达式我不能得到完整的字符串..问题在哪里?这让我抓狂......
最好的问候..
答案 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
答案 1 :(得分:0)
您正在Token
和Amount:
之间寻找某事
所以正则表达式
(?<=Token\:)(.*?)(?=Amount\:)
会匹配你要找的东西。
的说明强>:
(?<=Token\:)
:它看起来是后面的,所以只有当'Token:'出现在它之后的表达式之前时,你在此之后写的表达式才匹配。
(.*?)
:使用换行符匹配除之外的每个字符。所以,你可以匹配任何东西,你需要多少次,直到它找到你在(.*?)
之后写的东西(即匹配将在字符串'Amount:',如果在当前匹配之前找到)停止。
(?=Amount\:)
:这是一个展望未来。除了在上一个匹配的表达式之后它寻找'Amount'右之外,以完全相同的方式工作。
我不知道如何用你试图解决问题的另一种方式来帮助你,但希望一旦你说你尝试了正则表达式就满足了你(因此我推断你愿意使用它们:))。