2013-07-19 169 views
3

我需要一個正則表達式來匹配數字列表,而另一個匹配數字範圍(在這兩種情況下表達式永遠不會失敗)。範圍應由一個數字,一個破折號和另一個數字(N-N)組成,而列表應由用逗號(N,N,N)分隔的數字組成。下面是一些例子。正則表達式匹配範圍或數字列表

範圍:

'1-10' => OK 
Whateverelse => NOK (e.g. '1-10 11-20') 

列表:

'1,2,3' => OK 
Whateverelse => NOK 

這裏是我的兩個正則表達式:

  1. [0-9] + [\ - ] [0-9] +
  2. ([0-9] + ,?)+

...但我和他們的幾個問題...例如:

在評估'1-10'正則表達式2場比賽1 ...但它不應該匹配任何內容,因爲該字符串不包含列表。

然後,評估'1-10 11-14'時,正則表達式1場比賽1-10 ...但因爲字符串中包含的不僅僅是一個範圍更不應該匹配任何。

我錯過了什麼?謝謝。

+0

'1,2,4'OK?你需要依次編號嗎? – unlimit

+0

就像一個提示,你可以使用這個:http://regexpal.com/來測試正則表達式 –

+0

當你想要高級功能,它也取決於誰使用正則表達式的味道。 Perl有一組功能。 Awk另一個。 UNIX樣式程序深深地依賴於正在使用的操作系統。 – Gilbert

回答

5

試試這個:

^((\d+-(\*|\d+))|((\*|\d+)-\d+)|((\d)(,\d)+))$ 

測試結果:

1-10   OK 
1,2,3  OK 
1-*   OK 
*-10   OK 
1,2,3 1-10 NOK 
1,2,3 2,3,4 NOK 
*-*   NOK 

正則表達式的可視化:

Visualization of the regex

編輯:增加了對wildcar根據OP的評論d *

+0

這個工程,正是我正在尋找...我剛剛添加了通配符的支持,以允許像'3 - \ *'或'\ * - 10'的表達式:^(([\\ * \ d] + - [\\ * \ d] +)|((\ d)(\ d)+))$;問題是這個正則表達式還匹配'\ * - \ *'等表達式(通配符可以在右邊或左邊,而不是兩邊)。 – j3d

+0

我假設你想要匹配'1- *,* -1'而不是'* - *'?看到我更新的答案。 – unlimit

+0

簡單完美!非常感謝 :-) – j3d

1

首先,你應該使用anchors,以確保正則表達式匹配涵蓋了整個字符串,而不是隻是一個字符串:

^[0-9]+-[0-9]+$ 

然後,逗號是你的第二個正則表達式可選。試試這個:

^([0-9]+,)+[0-9]+$ 
0

您的問題最簡單的解決方法是換一組額外的括號周圍的第二個結果:

(([0-9]+,?)+) 

正如其他人所指出的,如果你正在服用的文字輸入和多數民衆贊成在整個輸入你應該開始和結束它^$

^(([0-9]+,?)+)$ 

如果您正在搜索的文本,提取這些值的身體,那麼你就不需要這一點。

括號表示匹配組。如果您將(?:添加到開頭而不是(,也可以將內部支架標記爲「非捕獲組」。這會給你帶來:

((?:[0-9]+,?)+) 

這將意味着唯一的捕獲值是你想要的。你也可以忽略第二次捕獲。

0

這一個是有點不同。它用於Procurve交換機上的端口。
^(((\d+)|(\d+-\d+))(,((\d+)|(\d+-\d+)))*)$
它在Perl中。

1     OK 
2     OK 
3     OK 
1-4     OK 
0-A     NOK 
83-91    OK 
14,15,16    OK 
14,20-25,91   OK 
a,b-c,5,5,5   NOK 
this-is,5,7,9  NOK 
9,8,1-2,1-7   OK 

我沒有包括從上面的*。你(@unlimit)用了那個美妙的圖表?

-E