2010-11-04 58 views
0

我收到了更改請求,我不確定如何最好地處理它。如果客戶搜索某物,並且他們指定的年份或年份範圍大於我們在數據庫中的範圍,則必須返回與我們擁有的最新年份範圍相對應的結果。如何解析字符串以提取年份範圍值?

目前我們已經在數據庫中的所有結果遵循以下模式之一:

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' 

有用於Thing1 Thing2更多結果可在世界上,馬上要到2060年,但我們只保留+14因爲在14年後(比如2026年或2028年),這些數據與之前的年份完全一樣。

我們有最大的一年,在每2年2年所有腦幹增加最大的一年。因此,在2012年,我們將有Thing1 Thing2 2026起,最大的存在將是2062年。

所以基本上,我需要確定客戶端何時搜索[Thing1(或)Thing2與一年範圍],如果第一年的值大於[今年+ 14]我要回到[今年+ 14],但前提是當前年份是偶數年,否則我必須返回[今年+ 13]。

我遇到的麻煩是如何確定不遵循一個明確的模式,比年初範圍的第一部分以外的字符串中間一年有4位數的年份開始。

什麼是我去這個最好的方法是什麼?有人可以建議我如何解決這個問題?謝謝。

回答

1

此正則表達式模式將很好地工作:\b(?<Year1>\d{4})(?:-(?<Year2>\d{2,4}))?\b

說明:

  • \b:是一個字的邊界,以確保我們捕獲年完全靠自己而不是作爲另一單詞的一部分(即,沒有部分匹配) - 這是用於錨定圖案的兩端
  • (?<Year1>\d{4}):命名捕獲組匹配4個位數
  • (-(?<Year2>\d{2,4}))?:此相匹配的-破折號,然後使用一個名爲捕獲組第2年,因爲這些年來,長短不一相匹配2-4重複數字。開始和結束括號將這種模式分組在一起,最後尾隨?使得整個組在第二年不存在的情況下可選。

技術上\d{2,4}部分接受07,,2007。顯然,一個3位年不正確。我建議你執行額外的錯誤檢查來捕獲這樣的場景。您可以通過將其更改爲\d{2}|\d{4}來阻止它,但這樣您就會匹配Year1而不是Year2,並且會失去用戶輸入。

下面的代碼:

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(); 
} 
0

也許只是搜索的第一個4位數字(如果有的話)的字符串,並把它們當作今年將工作?

0

或正則表達式像

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