[英]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()
進行轉換,針對有效范圍進行測試將是多余的,但也將更加明確 。 只要您注釋了使用正則表達式的意圖,在這種情況下使用正則表達式可能不是一個壞選擇。
/^(100|[0-9]{1,2})%?$/
在此處進行測試: 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.