2017-03-08 102 views
2

使用正則表達式可以允許匹配具有最大數量的字符,並將其劃分爲不同的字符類?正則表達式:限制整個匹配和字符類別

我需要匹配最多4位數的總數,有或沒有小數位數。因此,這些應該都是一致的正則表達式:

123 
1234 
12.34 
123.4 

但這些不應該:

12345 
12.345 

在概念上,這樣的事情應該工作,只是它不:

([0-9]{0,4}([.]?[0-9]{0,4})){0,4} 
+0

如果整個輸入是數字,或者是更大輸入內的數字,您希望匹配嗎? – Bohemian

+0

'12.'和'.12'是否有效? – Toto

回答

1

使用向前看斷言有最多1點:

^(?!([^.]\.){2})(?!\d{5})[\d.]{3,5}$ 
  • (?!([^.]\.){2})手段「放眼望去的任何地方,不會有2個點
  • (?!\d{5})的意思是‘展望未來,有沒有5個位數直’
  • [\d.]{3,5}指‘的數字和點3-5’

請參閱live demo


要限制十進制數字來最大2,加(?!.*\.\\d{3,}$)這是一種消極的前瞻了「點,然後3+位數底」,即:

^(?!([^.]\.){2})(?!\d{5})(?!.*\.\\d{3,}$)[\d.]{3,5}$ 

live demo

+0

[仍然無法使用](https://regex101.com/r/dLxRDG/3) – Vallentin

+0

@Vallentin你沒有測試我的正則表達式:你已經放棄了'^'和'$' – Bohemian

+0

你假設每行有1個數字。然而這不是OP如何提出這個問題。 – Vallentin

1

它不漂亮,但你可以這樣做:

(\d{1,4}|\d{0,3}\.\d|\d{0,2}\.\d{0,2}|\d\.\d{0,3}) 

只要確保你有一些邊界控制字符。

這樣說:

(?:^|[^\d.])(\d{1,4}|\d{0,3}\.\d|\d{0,2}\.\d{0,2}|\d\.\d{0,3})(?:$|[^\d.]) 

您可以see here,它按預期工作。

但是我會建議在這個特定情況下使用另一個工具。

+0

小數點必須是可選的,不是嗎? –

+0

@KennethK他們是'\ d {0,4}'匹配'1234'。 – Vallentin

+0

是的,我剛剛意識到這一點。對不起:\ –

1

以下正則表達式應該這樣做......

\b(?:\d{1,3}\.\d{1,2}|\d{1}\.\d{1,3}|(?<!\.)\d{1,4}(?!\.))\b 

看到regex demo/explanation

1

如果您正則表達式的味道接受它,你可以使用前瞻,如:

編輯:允許最多2位小數

^(?:\d{1,4}|(?=.{1,5}$)\d+\.\d{1,2})$ 

說明:

^    : begining of string 
    (?:   : start non capture group 
    \d{1,4}  : 1 up to 4 digit 
    |   : OR 
    (?=   : lookahead 
     .{1,5}$ : 1 up to 5 character (it could be .{3,5} if at least 1 digit is mandatory on each side of the dot) 
    )   : end lookahead 
    \d+   : 1 or more digits, integer part 
    \.   : dot 
    \d{1,2}  : 1 or 2 digits, decimal part 
)    : end group 
$    : end of string 

var test = [ 
 
123, 
 
1234, 
 
12.34, 
 
123.4, 
 
12345, 
 
12.345, 
 
1.234 
 
]; 
 
console.log(test.map(function (a) { 
 
    return a+' :'+/^(?:\d{1,4}|(?=.{1,5}$)\d+\.\d{1,2})$/.test(a); 
 
}));

+0

@MichielMeulendijk:請注意,接受的答案不匹配小於3位數的數字,即。 '1'或'45' – Toto