以int16来举例
答案
^([1-6]\d(?<!6[6-9])\d(?<!65[6-9])\d(?<!655[4-9])\d(?<!6553[6-9])|0|10{4}|[1-9]\d{0,3})$
解析
int16的范围是 0~65535
。我们把它分解为 0
1~9999
10000 ~ 65535
。前两组很简单如下
0
[1-9]\d{0,3}
正则表达式 否定式向后查看
(?<!exp2)exp1:查找前面不是 exp2 的 exp1
例子
(?<![0-9]+)runoob //匹配前面不是数字的 runoob字符串
字符串
123456runoob-googlerunoob456
将会匹配到 google后面的 runoob而不是 123456后面的runoob。
虽然参考网站里没有写,但是还可以这么写
exp1(?<!exp2) : 匹配exp1但是会去掉符合exp2的情况
例子
\d\d(?<!23) //匹配两个数字但是不会匹配 23 的情况
45匹配成功 23匹配失败
参考
第三组 : 第一个数字可以取 1-6,第二个数字可以取 0-9。但是第一个数字是 6,那么第二个数字就不能取 6-9(也就是只能取0-5)。第三个数字可以取0-9。但是如果第一个第二个数字正好是65,那么第三个数字就不能取6-9(也就是只能取0-5)。依次类推
[1-6]\d(?<!6[6-9]) //第一个数匹配 1-6,第二个数可以匹配 0-9,去除掉 第一个数为6的前提下第二个数为 6-9中的某一个数的情况。
完整表达式
[1-6]\d(?<!6[6-9])\d(?<!65[6-9])\d(?<!655[4-9])\d(?<!6553[6-9])
结尾
最后将它们组合起来,并添加上定位符
- 你要匹配的字符串只是由数字构成如
"12345"; "45";"65536";"65537" 等等
添加定位符
^([1-6]\d(?<!6[6-9])\d(?<!65[6-9])\d(?<!655[4-9])\d(?<!6553[6-9])|0|10{4}|[1-9]\d{0,3})$
- 你要匹配的字符串是字母加数字串等等
this is a number 65535 and 65536 and 456
添加定位符
\b([1-6]\d(?<!6[6-9])\d(?<!65[6-9])\d(?<!655[4-9])\d(?<!6553[6-9])|0|10{4}|[1-9]\d{0,3})\b
其它类型如法炮制即可