2010-07-08 133 views
0

任何人都可以告訴我如何爲以下場景編寫正則表達式。輸入只能是數字或-(連字符)或,(逗號)。輸入可以當指數值範圍內給出被給定爲以下任何一種用於驗證的正則表達式

23 

23,26 

1-23 

1-23,24 
24,25-56,58-40,45 

此外,第二數量應該比第一個更大。 23-1不應該被允許。如果已輸入號碼,則不應再次允許。就像1-23,23不應該允許的那樣

+0

正則表達式在值的比較中會遇到一個非常困難的時刻(不要讓相同的數字超過一次,如果它的過去是一個「 - 」檢查,看看它是否更小......)你可能會更好地使用JavaScript來做這件事 - 用逗號分隔列表並發現連字符等。 – 2010-07-08 19:33:10

回答

0

我認爲用正則表達式最好花時間去學習它們,而不是把別人的腳本扔進你的東西而不知道它在做什麼。你有優秀的資源來幫助你。

嘗試這些站點:

這些都是前三個結果形成了谷歌搜索。一切都是好資源。祝你好運。記住要仔細檢查你的正則表達式實際上是否匹配,通過輸出到屏幕上,不要假設你知道(它已經咬了我一次以上)。

0

我不認爲你可以用RegEx做到這一點。尤其不是關於設置邏輯的部分 - 已經使用的數字,有效的順序範圍。

我的建議是讓正則表達式驗證格式,至少是逗號,數字。然後在逗號上使用split方法,並循環輸入以驗證集合。例如:

var number_ranges = numbers.split(','); 
for (var i = 0; i < number_ranges.length; ++i) { 
    // verify number ranges in set 
} 

這個邏輯並不是微不足道的。

+0

[\ d] +([ - | \,] [\ d])*這是否驗證格式?或者我錯過了什麼? – Ravinandan 2010-07-08 19:45:54

+0

** Stephen P **提供了一個很好的正則表達式。現在你只需要循環通過值和非常集。 – 2010-07-08 20:30:46

3

我不打算與「我認爲」或「也許」 - 你不能與正則表達式做這個。針對正則表達式

匹配可以驗證輸入的形式是正確的,並且也可以用於提取輸入件,但它可以做值比較,或重複去除(除了在有限明確定義的情況)或範圍檢查。

您作爲輸入的內容我將解釋爲逗號分隔的值列表或值範圍;在BNFish符號:

value :: number 
range :: value '-' value 
term :: value | range 
list :: term [','term]* 

一個正則表達式可以建立,將匹配該驗證正確的結構,但你必須爲數值的比較做其他驗證和防止重複的號碼。

最straigtforward正則表達式我能想到的(臨時通知)這是

([0-9]+|[0-9]+-[0-9]+)(, *([0-9]+|[0-9]+-[0-9]+))* 

您有數字數字位數,後面可以跟逗號[可選空間(數字位數 - 數字) - 重複零次或多次。


我測試此正則表達式在http://www.fileformat.info/tool/regex.htm與輸入3,4-12,6,2,90-221

當然可以代替[0-9]與[\ d]對於正則表達式的方言,允許它。

+0

非常感謝!!!!我只是在BNFish表示法的幫助下寫了相同的reg exp ...再次感謝 – Ravinandan 2010-07-08 20:11:50

2
var str = "24,25-56,24, 58- 40,a 45", 
trimmed = str.replace(/\s+/g, '') 

//test for correct characters 
if (trimmed.match(/[^,\-\d]/)) alert("Please use only digits and hyphens, separated by commas.") 

//test for duplicates 
var split = trimmed.split(/-|,/) 
split.sort() 
for (var i = 0; i < split.length - 1; i++) { 
    if (split[i + 1] == split[i]) alert("Please avoid duplicate numbers.") 
} 

//test for ascending range 
split = trimmed.split(/,/) 
for (var i in split) { 
    if (split[i].match("-") && eval(split[i]) < 0) alert("Please use an ascending range.") 
}