代码之家  ›  专栏  ›  技术社区  ›  DaveDev

如何解析字符串以提取年份范围值?

  •  0
  • DaveDev  · 技术社区  · 14 年前

    我收到了一个变更请求,我不确定如何最好地处理它。如果客户搜索某些内容,并且他们指定的年份或年份范围大于我们数据库中的值,则我必须返回与我们的最近年份范围相对应的结果。

    目前,我们在数据库中得到的结果都遵循以下模式之一:

    Thing1 Thing2 S1 // There's some results with no year
    Thing1 Thing2 2006-07 Series 6 // there's some results with 'Series X'
    Thing1 Thing2 2006-2007 S12 RP // some resuls have SN or SN YZ
    Thing1 Thing2 2020-21 S6 // some results don't have a full second year
    Thing1 Thing2 2022-2024 S12
    Thing1 Thing2 2024 Onwards // the result that matches the final year just has the year & 'Onwards'
    

    我们的最大年期和最高年期每2年增加2年。所以在2012中,我们将有1,2,2,2026,并且存在的最大值是2062。

    所以基本上,我需要确定客户什么时候搜索[Thing1(或)Thing2(具有一年范围),如果第一年的值大于[Thing1(或)Thing2+14],我必须返回[Thing1(或)Thing2+14],但前提是当前年是偶数年,否则我必须返回[Thing1(或)Thing2+13]。

    我遇到的麻烦是如何在字符串中间标识一年,该字符串不遵循定义良好的模式,除了年份范围的第一部分以4位数的年份开始。

    我最好的办法是什么?有人能建议我如何解决这个问题吗?谢谢。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Ahmad Mageed    14 年前

    这个regex模式可以很好地工作: \b(?<Year1>\d{4})(?:-(?<Year2>\d{2,4}))?\b

    说明:

    • \b
    • (?<Year1>\d{4}) :命名捕获组匹配4位数字
    • (-(?<Year2>\d{2,4}))? - 破折号,然后在第二年使用一个命名的捕获组,该组匹配2-4个重复的数字,因为这些年的长度不同。左括号和右括号将这个模式组合在一起,最后是尾随的 ?

    从技术上讲 \d{2,4} 部分接受07, 107个 2007年。显然,3位数的年份是不正确的。我建议您执行额外的错误检查来捕获此类场景。你可以把它改成 \d{2}|\d{4}

    代码如下:

    string[] inputs = { "Thing1 Thing2 S1", "Thing1 Thing2 2006-07 Series 6", "Thing1 Thing2 2006-2007 S12 RP", "Thing1 Thing2 2020-21 S6", "Thing1 Thing2 2022-2024 S12", "Thing1 Thing2 2024 Onwards" };
    string pattern = @"\b(?<Year1>\d{4})(-(?<Year2>\d{2,4}))?\b";
    Regex rx = new Regex(pattern);
    
    foreach (var input in inputs)
    {
        Match m = rx.Match(input);
        Console.WriteLine("{0}: {1}", m.Success, input);
        if (m.Success)
        {
            string year1 = m.Groups["Year1"].Value;
            string year2 = m.Groups["Year2"].Value;
            Console.WriteLine("Year1: {0}, Year2: {1}", year1, year2 == "" ? "N/A" : year2);
        }
        Console.WriteLine();
    }
    
        2
  •  0
  •   Gintautas Miliauskas    14 年前

    也许只需搜索字符串中的前4个数字字符(如果有的话)并将其视为年份就可以了?

        3
  •  0
  •   Nesim Razon    12 年前

    perl -ne '/(\d\d\d\d)-(\d\d(\d\d)?)/; print "$1:$2:$3"'