2011-02-24 64 views
0

我試圖匹配以下內容,並且我正在很難做到這一點。使用正則表達式匹配0到100或0%到100%

我想允許0到100或0%到100%。在我的文本框中,我去掉了%,所以如果它們放入100中,它不會在正則表達式中失效並跳過該條。

因此,我需要一個正則表達式來允許0到100或0%到100%。 101或101%無效。

目前,我有以下

(?:^((\\%)?100(\\%)?$)|(?:^(\\%)?[0-9]{1,2}(\\%)?)((\\.|,)?[0-9]+)?$) 

但是,讓101而不是101%

請幫幫忙!任何幫助將不勝感激。

+0

**有些人,當面對一個問題,認爲「我知道,我會用正則表達式。」現在他們有兩個問題.. ** - [傑米Zawinski](http://www.jwz.org/)1997 – 2011-02-24 22:23:52

回答

14

你正在嘗試使用正則表達式來做一些正則表達式並不打算做的事情。你有JavaScript和Python標籤;你應該使用正則表達式來確保輸入是一個數字,然後使用javascript或python來確定數字是太大還是太小。這樣會容易得多。

+0

另見http:// stackoverflow.com/questions/4098086/to-use-or-not-to-use-regular-expressions/40 98123#4098123。 – delnan 2011-02-24 21:20:15

+0

是的,不要使用正則表達式作爲所有工具的一個工具,即使它可以完全不可讀,即使它非常簡單並且可能包含一些奇怪的邊角情況。 – Voo 2011-02-24 22:16:21

0

在@ eykanal的答案的精神,這裏有一個正則表達式:

(\d{1,3})%?作品我用Python this

我的測試文本是:

101 
100 
100% 
101% 
0% 
0 
50% 

,將讓你只需數,然後你就可以分析和判斷它是否是你可以接受的範圍。

+0

這只是匹配0或100,不是嗎? – BoltClock 2011-02-24 21:18:17

+0

@BoltClock:是的,我誤解了這個問題。固定。 – nmichaels 2011-02-24 21:21:31

+1

這將接受999以及... – Martijn 2011-02-24 21:22:24

1

JavaScript的 「parseInt函數」 使用

parseInt函數並執行以下操作:

"100" -> 100 
"10k" -> 10 
"100%" -> 100 
在此之後

,請檢查您的數字小於101

例如...

function parsePerc(value) { 
    return parseInt(value) < 101; 
} 
3

/^(100|[0-9]{1,2})%?$/

  • 「100」或由一位或兩位數字組成的任何數字
  • 可能後跟百分號。

在此處測試:http://jsbin.com/azeya3

哦,是的,第一個捕獲包含數字。

9

有些人,當與 面臨的問題,認爲「我知道,我將使用 正則表達式。「現在他們有 兩個問題.. - Jamie Zawinski 1997年

在所有的嚴重性,你正在嘗試做一些事情,正則表達式不打算這樣做,這是執行的邏輯。你問的是,這個字符串是否包含一個數字,這是否正確,如果是,它是否爲>= 0 && <= 100其中不是正則表達式可以或應該做的事情。

儘管表達式^(\d{1,2}|100)%?$會告訴您輸入是否與模式匹配,並讓您使用該組拉出數字。結果落入>=0 && <= 100範圍的事實是副作用。這種明顯的範圍檢查行爲不適用於任何其他任意數字的任意範圍。爲了維護代碼,應避免副作用。

它是最佳解決方案嗎?意圖明顯從只看表達式?我會認爲沒有,不是沒有一些評論描述的意圖。

的JavaScript

我想一個更好的更易於維護的解決方案是使用parseInt()功能,然後將結果明確地比較>= 0<= 100Explicit is Better than Implicit並且更自我記錄。

的Python

你仍然將不得不訴諸正則表達式來驗證格式,而只提取數字和轉換,使用int(),對有效範圍的測試將是多餘的,但也更明確 。在這種情況下使用正則表達式可能不是一個很糟糕的選項,只要您評論使用正則表達式的意圖即可。

Easier to escape: n-layered nested quotes or an iron maiden?

+0

另外,永遠不要忘記:http://xkcd.com/208/ – Martijn 2011-02-24 22:37:44

1

問題是標籤 「蟒蛇」,所以我會在Python回答:

def is0to100(num): 
    try: 
     return 0 <= int(num.rstrip('%')) <= 100 
    except ValueError: 
     return False 

返回true如果傳入的值,減去可能尾隨 '%',是一個介於0和100之間的有效整數。我沒有對它進行基準測試,但我認爲它比正則表達式快得多。

0

首先,我同意eykanal和賈羅德·羅伯遜

不過,這是一個正則表達式如此簡單,我並不贊同,並認爲它是更好的解決方案根據我:

'(\d\d?|100)(?!\d)\Z' and use of match() 

我認爲在第一個位置\d\d?提供檢測數字< 100,第二個位置100單獨,是更自然的邏輯。

而且\d\d?短,比\d{1,2}

編輯

更好更快地理解爲:

'(\d\d?|100)\D?\Z' 

但這些RE都進行檢測。既然目的是爲了驗證,這一個就夠了:

'(\d\d?|100)\Z' 
1

匹配0到100

^100$|^[123456789][0-9]$|^[0-9]$ 

匹配0%到100%

^100[%]$|^[123456789][0-9][%]$|^[0-9][%]$