0

无论我尝试什么,它都与标志不匹配。我什至尝试使用字符串作为模式。这个函数应该能够接受一个类似的字符串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
4

1 回答 1

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
于 2012-06-21T22:46:56.407 回答