簡體   English   中英

使用正則表達式匹配0到100或0%到100%

[英]Match 0 to 100 or 0% to 100% using regex

我正在嘗試匹配以下內容,而我卻很難做到這一點。

我想允許0到100,或0%到100%。 在我的文本字段中,我將%去除了,因此,如果將它們放入100,它將不會在正則表達式處失敗並跳過該去除。

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

目前,我有以下

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

但這允許101%,但不允許101%

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

您正在嘗試使用正則表達式執行正則表達式本不應該做的事情。 您有javascript和python標簽; 您應該使用regex來確保輸入為數字,然后使用javascript或python來確定數字太大還是太小。 這樣會容易得多。

有些人在遇到問題時會想:“ 我知道,我將使用正則表達式。 ”現在他們有兩個問題。-傑米·扎溫斯基 1997

認真地說 ,您正在嘗試執行正則表達式不希望執行的操作,即執行邏輯。 您要問的是,此字符串是否包含數字,這很好,如果可以,則是>= 0 && <= 100 ,這不是正則表達式可以或不應該做的事情。

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

這是最佳解決方案嗎? 僅從表情看,意圖就很明顯嗎? 我會說不 ,不是沒有一些描述意圖的評論。

的JavaScript

我認為更好的可維護性解決方案是使用parseInt()函數,然后將結果顯式比較為>= 0<= 100 顯式比隱式更好,並且更能自我記錄。

蟒蛇

您仍將不得不使用正則表達式來驗證格式並僅提取數字並使用int()進行轉換,針對有效范圍進行測試將是多余的,但也將更加明確 只要您注釋了使用正則表達式的意圖,在這種情況下使用正則表達式可能不是一個壞選擇。

更容易逃脫:n層嵌套引號或鐵娘子?

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

  • '100'或由一位或兩位數字組成的任何數字
  • 可能后跟一個百分號。

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

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

在javascript“ parseInt”上使用

parseInt執行以下操作:

"100" -> 100
"10k" -> 10
"100%" -> 100

之后,檢查您的電話號碼是否小於101。

例...

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

這個問題被標記為“ python”,所以我將在Python中回答:

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

如果傳入的值減去可能的尾隨'%',它是0到100之間的有效整數,則返回True。我沒有對其進行基准測試,但我認為這比正則表達式快得多。

匹配0至100

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

匹配0%至100%

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

本着@eykanal回答的精神,這是一個正則表達式:

(\\d{1,3})%? 對我的作品在Python與

我的測試文字是:

101
100
100%
101%
0%
0
50%

這樣就可以得到一個數字,然后可以解析該數字並確定該數字是否在可接受的范圍內。

首先,我同意eykanal和Jarrod Roberson

但是,使用正則表達式是如此簡單,以至於我不同意,並且根據我來說,這是更好的解決方案:

'(\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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM