0

在我正在使用的 vb.net 命令行工具中,有一个名为 period P 的命令:我想以下列格式指定日期

P:2009                       'translate this to 01.01.2009 to 31.12.2009
P:2008 To 2010               'translate this to 01.01.2008 to 31.12.2010
P:01.01.2012 To 22.11.2013   'stays the same

在我得到 P: 之后的文本后,我想使用正则表达式对其进行验证并将缺少的部分添加到其中,因为我将在 sql 命令中使用它。

有什么建议吗?

4

4 回答 4

3

这里不需要正则表达式;只是围绕“To”的 String.Split(),然后围绕“.”的 String.Split 在结果上。根据结果​​数组的大小,您知道是仅从年份还是三个组件创建结果文本。

于 2013-01-05T22:56:03.250 回答
1

我知道,您不是在寻找 Python 解决方案,但也许这里可以让您了解如何用您的语言做到这一点:

In [1]: import re

In [2]: re.sub(r'P:(\d{4})', '01.01.\g<1> to 31.12.\g<1>', 'P:2009')
Out[2]: '01.01.2009 to 31.12.2009'

In [3]: re.sub(r'P:(\d{4}) To (\d{4})', '01.01.\g<1> to 31.12.\g<2>', 'P:2008 To 2010')
Out[3]: '01.01.2008 to 31.12.2010'

没有正则表达式的解决方案可能如下所示:

In [4]: def create_date(s):
  ....:     if s.startswith('P:'):
  ....:         years = s[2:].split(' To ')
  ....:         if len(years) == 1:
  ....:             return '01.01.' + years[0] + ' to 31.12.' + years[0]
  ....:         elif len(years) == 2:
  ....:             return '01.01.' + years[0] + ' to 31.12.' + years[1]         

In [5]: create_date('P:2008')
Out[5]: '01.01.2008 to 31.12.2008'

In [6]: create_date('P:2008 To 2010')
Out[6]: '01.01.2008 to 31.12.2010'
于 2013-01-05T23:04:07.717 回答
1

这里是C#代码,可以直接转换成vb.net :)

     string input = "P:2008 To 2010";
     string result = Regex.Replace(input, "^P:([0-9]{4})$", "P:01.01.$1");
     if (input == result)
     {
        result = Regex.Replace(input, "^P:([0-9]{4}) To ([0-9]{4})$", "P:01.01.$1 to 01.01.$2");
     }
于 2013-01-05T23:15:07.260 回答
1

因为您不打算将日期字符串传递给 SQL(ARE YOU?),您不妨解析日期以确保有效性:

Imports System.Globalization

Module Module1

    ' Take a string of year or year and month or year and month and day and
    ' convert it to a DateTime, defaulting to month=1 or day=1 if they are missing
    ' Throw an exception if this is not possible.
    Function MakeExplicitDate(s As String) As DateTime
        Dim cul = New CultureInfo("en-GB")
        Dim dt As DateTime

        If Not DateTime.TryParse(s, cul, Nothing, dt) Then
            s &= "-01"
            If Not DateTime.TryParse(s, cul, Nothing, dt) Then
                s &= "-01"
                If Not DateTime.TryParse(s, cul, Nothing, dt) Then
                    Throw New Exception("Could not parse date.")
                End If
            End If
        End If

        Return dt

    End Function

    Sub Main()

        Dim s = "P:2009 to 2011.02.13"

        If s.StartsWith("P:") Then

            s = s.Substring(2, Math.Max(0, s.Length - 2))
            Dim dates = s.ToLowerInvariant.Split({"to"}, StringSplitOptions.RemoveEmptyEntries)

            If dates.Count > 2 Then
                Throw New Exception("Too many dates supplied.")
            End If

            Dim datesToUse As New List(Of DateTime)

            For i = 0 To dates.Count - 1
                datesToUse.Add(MakeExplicitDate(dates(i)))
            Next

            For Each dtu In datesToUse
                Console.WriteLine(dtu.ToString("yyyy-MM-dd"))
            Next

        End If

        Console.ReadLine()

    End Sub

End Module
于 2013-01-05T23:38:44.260 回答