2011-12-23 48 views
0

我在構建正則表達式時遇到了問題,因爲我真的是主題的noob。用於驗證類似範圍表達式的正則表達式

目的是驗證來自用戶的輸入 '範圍' 的表達式,如下所示:

  • 20-30
  • 11,12(2和4)(和20之間30)
  • -10(小於10)
  • 80-(大於80)

或任意數量的那些的組合,如:

-10,11,12,20-30,80-

我已經能夠使用以下 正則表達式(並調用.GetMatches())從這樣的字符串解析不同的組件:

var rangeRegex = new Regex(@"\d+(\.\d+)?-\d+(\.\d+)?"); 
var smallerThanRegex = new Regex(@"(?<![\d\.])-\d+(\.\d+)?"); 
var greaterThanRegex = new Regex(@"\d+(\.\d+)?-(?!\d)"); 

我只是不知道如何將它們組合成可用於驗證一個字符串是否是一個有效的「範圍表達式」大正則表達式。

有沒有人知道如何做到這一點而不浪費整整一週(就像我會)?非常感謝您提前!

回答

1

這將是檢查語法的正則表達式,它沒有關於字符串語義的想法!

^(?<=\D|^)(?:\d+(?:\.\d+)?-\d+(?:\.\d+)?|-\d+(?:\.\d+)?|\d+(?:\.\d+)?-|\d+(?:\.\d+)?)(?:,(?:\d+(?:\.\d+)?-\d+(?:\.\d+)?|-\d+(?:\.\d+)?|\d+(?:\.\d+)?-|\d+(?:\.\d+)?))*(?=\D|$)$ 

看到它here on Regexr

但像Guffa建議將是更好的解決方案逗號分割(+1)!

+0

非常感謝您,那正是我期待的!我想我會同時使用您的解決方案和Guffa建議的解決方案,使其完全失效並濾除多餘的部件(如20-40,22)。 – jkokorian 2011-12-23 09:34:04

2

我認爲你應該首先在逗號上分割它們,然後驗證並解析每個項目。沒有辦法寫一個正則表達式來驗證數字是否合理。

考慮例如輸入如1,2,1,1,210-20,11-12,14-16,其中您有重複值和重疊範圍。您必須決定如何處理不一致的數據,例如是否允許和合並重疊範圍,以及範圍是否必須按正確順序排列。

+0

謝謝,你有一點。我去做。 – jkokorian 2011-12-23 09:34:49