为什么我的正则表达式忽略加号或减号?

时间:2012-06-21 22:21:38

标签: regex vb.net .net-3.5

无论我尝试什么,它都不会与标志相匹配。我甚至尝试使用字符串作为模式。此函数应该能够采用类似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

1 个答案:

答案 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