一、 选择或者关系运算 : |
规则:
- 自左向右匹配,一旦匹配上,就不会回头
- 直接上代码:
console.log(/12|34|56/.exec('1'));
console.log(/12|34|56/.exec('3'));
console.log(/12|34|56/.exec('12'));
console.log(/12|34|56/.exec('56'));
console.log(/12|34|56/.exec('123456'));
- 3,4行打印结果证明: | 是分支 也就是选择关系,
- 第5行打印结果证明: 自左向右匹配,一旦匹配上,就不会回头,所以只打印了 12
1.1、匹配 ip:192.168.1.35 地址呢?
这是我想的办法,正则表达式挺直观的, 但是 它是错的!
console.log(/[0-255]/.exec('684'));
console.log(/[0-255]/.exec('6'));
console.log(/[0-255]/.exec('2')); //[0-255]相当于[0-2]
console.log(/[0-9]*[0-9]*[0-9]*/.exec('684'));
//输出结果
null
null
[ '2', index: 0, input: '2', groups: undefined ]
[ '684', index: 0, input: '684', groups: undefined ]
这个,[ ] 表示匹配该范围内一个字符;
[0-255] 理想是匹配 0~255 的数字,其实仔细想想它这是一下匹配了一个0-3位数字字符串,而 [ ] 只会匹配一个字符;
所以从概念上,这个方法就错了
二、匹配 ip
- 注解及源码:
// 0~255
// 首先从个位出发:
// [0-9] 包含 0~9范围
// 然后是十位:
// [1-9] 与个位相加就包含 10~99
// 百位:
// 1[1-9][0-9] 110~199
// 10[0-9] 100~109
// 2[0-4][0-9] 200~249
// 25[0-5] 250~255
// 使用简写方式:[0-9]:\d
var reg = new RegExp("(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)");
console.log(reg.exec('9'));
console.log(reg.exec('99'));
console.log(reg.exec('199'));
console.log(reg.exec('256'));
// 我们把共同的部分合并一下:
// 200~255 : 2(5[0-5]|[0-4]\d)
// 0~199 : [0,1]?\d{1,2}
// 拼接一下: (2(5[0-5]|[0-4]\d))|([0,1]?\d{1,2})
// 加上后面的 3 个重复部分,以及 . 号
var rex = new RegExp('((2(5[0-5]|[0-4]\\d))|[0,1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0,1]?\\d{1,2})){3}')
console.log(rex.test('127.0.0.1')); // true
console.log(rex.test('192.168.1.35')); // true
console.log(rex.test('253.256.0.1')); // false
console.log(rex.test('0.0.0.01')); // true