2012-04-11 51 views
4

如何寫正則表達式來驗證這種模式?正則表達式:6個位數或0-6號(數字或星)與至少一個明星

123456 - correct 
*1 - correct 
1* - correct 
124** - correct 
*1*2 - correct 
* - correct 
123456* - incorrect (size 7) 
12345 - incorrect (size 5 without stars) 

嘗試:

^[0-9]{6}$|^(([0-9]){1,6}([*]){1,5}){1,6}+$ 

但允許有多於6個號碼和不允許明星是號碼前。 沒有最小/最大數量的「*」符號(但所有符號的最大數量爲6)。

回答

14

在這裏你去:

^(?:\d{6}|(?=.*\*)[\d*]{1,6}|)$ 

這裏是做什麼的:

^   <-- Start of the string (we don't want to capture more than that) 
    (?:   <-- Start a non captured group (it will be used to do the "or" part) 
    \d{6}   <-- 6 digits, nothing more 
    |   <-- OR 
    (?=.*\*)  <-- Look ahead for a '*' (you could replace the first * with {0,5}) 
    [\d*]   <-- digits or '*' 
    {1,6}   <-- repeated one to six times (we know from the look ahead that there will be at least one '*' 
    |   <-- OR (nothing) 
)   <-- End the non capturing group 
$   <-- End of the string 

我不太清楚,如果你想空的情況下(但你說0-6 ),如果你真的想要1到6只是刪除最後|

0

如果任何數字0..9被允許嘗試這個正則表達式[0-9*]{2,6}
如果只是數字1..6在你的榜樣[1-6*]{2,6}

這是一個有點棘手,原因也12345將被驗證爲正確
example here

你確實需要有一個look-around解決方案已經被@Colin

+0

將它匹配'* 1'和'1 *'和'* 1 * 2'? – 2012-04-11 14:03:39

+0

在你的正則表達式中它必須是6位數字,但是在他的問題中最多是6位數字,不是嗎? – 2012-04-11 14:03:54

1

/([0-9建議] {6})| (([0-9] {0-5} & [*] {1-5}){0-6})/

這樣的?

+0

從0到9的6個數字或從0到9的0到5個數字,其中至少有1個*,其中最大長度爲6 – 2012-04-11 14:05:02

+0

我不知道爲什麼,但使用[gskinner.com](http ://gskinner.com/RegExr/)檢查 – Marcin 2012-04-11 14:11:55

+0

,因爲我忘記了在它前面用\退出*,對不起。 – 2012-04-11 14:13:33

0

試試這個:(更新)

([0-6]{6})|([0-6\*]{1,6}) 

它應該工作...

+0

它允許少於6個數字(只)被傳遞,所以它不起作用 – Marcin 2012-04-11 14:10:13

+0

@Marcin剛更新了它。 – 2012-04-11 14:11:43

+0

'([0-6 \ *] {1,6})'位表示您可以少於6位數,因爲您不必擁有'*'。 – 2012-04-11 14:21:02

1

恐怕你將不得不嘗試每個位置的*可能有,像這樣:

/([0-9]{6}|\*[0-9][0-9\*]{0,4}|[0-9]\*[0-9\*]{0,4}|[0-9]{2}\*[0-9\*]{0,3}|[0-9]{3}\*[0-9\*]{0,2}|[0-9]{4}\*[0-9\*]?|[0-9]{5}\*)/ 

編輯:

上述解決方案將不允許** 2

我錯了。你可以像Colin那樣期待。這是要走的路。

1
[1-6]{6}|([1-6]|\*){1,6}[^123456] 

這對你的作品給了輸入...

如果你想要別的東西,然後我更新...

1

你不能只用正則表達式做到這一點。你還需要一個長度檢查。然而,這是一個正則表達式,會有所幫助。

([\d*]*\*[\d*]*)|(\d{6}) 

驗證輸入,嘗試這樣的事情:

validate(input) 
{ 
    regex = "([\d*]*\*[\d*]*)|(\d{6})"; 
    digitregex = ".*\d.*"; // this makes sure they aren't all stars 

    return (input.length < 7 and regex.matches(input) and digitregex.matches(input)) 
} 
+0

是的,你可以。我做到了:) – 2012-04-11 14:18:24

+0

W ...?前瞻是標準的正則表達式特徵嗎? – 2012-04-11 14:22:04

+0

大部分是的,http://www.regular-expressions.info/lookaround.html – 2012-04-11 14:22:47

相關問題