2017-02-09 55 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));