2017-02-09 52 views
0

我有一個正則表達式的問題來匹配模式,也限制了人物的NUMER的NUMER:正則表達式匹配模式,也限制字符

比如我已經允許號碼前綴: 2, 31, 32, 35, 37, 38, 39, 41, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60

那麼我想數字只有和這個的最大長度等於9. 因此,例如數字如:255555555將沒問題,但31555555555555555將不會。

這是我試圖解決這一點,但它不工作,因爲它應該:

^((2|31|32|35|37|38|39|41|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60)+[0-9]*){9}$ 
+1

小心你的正則表達式 - ,如果你是完全按照你已經張貼在你的問題,這些空間可能是至關重要的 - 你不能墊正則表達式了與空白,使他們看起來更好,空白將成爲它的一部分。 –

+0

不僅它們最終成爲它的一部分,它們甚至會使一些正則表達式解析器在引發錯誤時拋出錯誤。 – Binarus

回答

5

使用正向前查找限制(但不匹配)的前綴,然後嚴絲合縫9位:

^(?=2|31|32|35|37|38|39|41|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60)\d{9}$ 
+0

這可能會減少 – Toto

+1

@Toto,沒關係。這個原則很重要。我不打算做字符集,只讓OP需要搜索我分組的內容,如果他想更改數字。 – ndn

1

您可以使用正則表達式:

(^2\d{0,8}$)|(^(31|32|35|37|38|39|41|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60)\d{0,7}$) 

這裏是一個live example


如果不產生這個表達式用數字從什麼地方,你可以將其降低到:

(^2\d{0,8}$)|(^(3[125689]|4[16789]|5[0-9]|60)\d{0,7}$) 

這裏是一個live example

1

您可以先測試長度然後再測試前綴。

function check(s) { 
 
    return /(?=^\d{1,9}$)^(2|3[125-9]|4[16-9]|5.|60)/.test(s); 
 
} 
 

 
console.log(['255555555', '31555555555555555', '33', '5a', '5', '50'].map(check));