无论我尝试什么,它都不会与标志相匹配。我甚至尝试使用字符串作为模式。此函数应该能够采用类似1 day -36mins + 2s -1s
的字符串并将其解析为TimeSpan
对象。有什么指针吗?
Public Function ParseTimeDelta(ByVal TimeDelta As String) As TimeSpan
Dim DayPattern As String = "\b([+-]?\w*\d+)\s*d(?:ay[s]?)?\b"
Dim HourPattern As String = "\b([+-]?\w*\d+)\s*h(?:(?:ou)?r[s]?)?\b"
Dim MinutePattern As String = "\b([+-]?\w*\d+)\s*m(?:in(?:ute)?[s]?)?\b"
Dim SecondPattern As String = "\b([+-]?\w*\d+)\s*s(?:ec(?:ond)?[s]?)?\b"
Dim Days As Integer = 0
Dim Hours As Integer = 0
Dim Minutes As Integer = 0
Dim Seconds As Integer = 0
Dim Regex As Text.RegularExpressions.Regex
Regex = New Text.RegularExpressions.Regex(DayPattern, Text.RegularExpressions.RegexOptions.IgnoreCase)
For Each Match As Text.RegularExpressions.Match In Regex.Matches(TimeDelta)
Days += CInt(Match.Groups(1).Value)
Next
Regex = New Text.RegularExpressions.Regex(HourPattern, Text.RegularExpressions.RegexOptions.IgnoreCase)
For Each Match As Text.RegularExpressions.Match In Regex.Matches(TimeDelta)
Hours += CInt(Match.Groups(1).Value)
Next
Regex = New Text.RegularExpressions.Regex(MinutePattern, Text.RegularExpressions.RegexOptions.IgnoreCase)
For Each Match As Text.RegularExpressions.Match In Regex.Matches(TimeDelta)
Minutes += CInt(Match.Groups(1).Value)
Next
Regex = New Text.RegularExpressions.Regex(SecondPattern, Text.RegularExpressions.RegexOptions.IgnoreCase)
For Each Match As Text.RegularExpressions.Match In Regex.Matches(TimeDelta)
Seconds += CInt(Match.Groups(1).Value)
Next
Return New TimeSpan(Days, Hours, Minutes, Seconds)
End Function
答案 0 :(得分:2)
它没有匹配,因为标志前没有字边界。固定的。
Public Function ParseTimeDelta(ByVal TimeDelta As String) As TimeSpan
Dim DayPattern As String = "((?:[+-]|\b)\w*\d+)\s*d(?:ay[s]?)?\b"
Dim HourPattern As String = "((?:[+-]|\b)\w*\d+)\s*h(?:(?:ou)?r[s]?)?\b"
Dim MinutePattern As String = "((?:[+-]|\b)\w*\d+)\s*m(?:in(?:ute)?[s]?)?\b"
Dim SecondPattern As String = "((?:[+-]|\b)\w*\d+)\s*s(?:ec(?:ond)?[s]?)?\b"
Dim Days As Integer = 0
Dim Hours As Integer = 0
Dim Minutes As Integer = 0
Dim Seconds As Integer = 0
Dim Regex As Text.RegularExpressions.Regex
Regex = New Text.RegularExpressions.Regex(DayPattern, Text.RegularExpressions.RegexOptions.IgnoreCase)
For Each Match As Text.RegularExpressions.Match In Regex.Matches(TimeDelta)
Days += CInt(Match.Groups(1).Value)
Next
Regex = New Text.RegularExpressions.Regex(HourPattern, Text.RegularExpressions.RegexOptions.IgnoreCase)
For Each Match As Text.RegularExpressions.Match In Regex.Matches(TimeDelta)
Hours += CInt(Match.Groups(1).Value)
Next
Regex = New Text.RegularExpressions.Regex(MinutePattern, Text.RegularExpressions.RegexOptions.IgnoreCase)
For Each Match As Text.RegularExpressions.Match In Regex.Matches(TimeDelta)
Minutes += CInt(Match.Groups(1).Value)
Next
Regex = New Text.RegularExpressions.Regex(SecondPattern, Text.RegularExpressions.RegexOptions.IgnoreCase)
For Each Match As Text.RegularExpressions.Match In Regex.Matches(TimeDelta)
Seconds += CInt(Match.Groups(1).Value)
Next
Return New TimeSpan(Days, Hours, Minutes, Seconds)
End Function