到正则表达式范围

传递两个数字,获得匹配范围的regex兼容源字符串。根据超过278万个测试断言进行验证。
请考虑跟随这个项目的作者, Jon Schlinkert,并考虑主演该项目,以展示您的: 心: 和支持。
安装
安装与 npm:
$ npm install --save to-regex-range
这是做什么的?
这个库生成 source 要传递给的字符串 new RegExp() 用于匹配一系列数字。
例子
const toRegexRange = require('to-regex-range');
const regex = new RegExp(toRegexRange('15', '95'));
返回一个字符串,以便您可以在将其传递给之前对其执行任何需要的操作 new RegExp() (比如添加 ^ 或 $ 边界,定义标志,或将其组合为另一个字符串)。
为什么要使用这个库?
方便
创建用于匹配数字的正则表达式变得非常复杂。
例如,假设您需要一个验证正则表达式来匹配用户id、邮政编码、社会保险号、税号等的一部分:
- 用于匹配的正则表达式
1= >/1/(简单) - 用于匹配的正则表达式
1通过5= >/[1-5]/(不坏…) - 用于匹配的正则表达式
1或5= >/(1|5)/(仍然容易…) - 用于匹配的正则表达式
1通过50= >/([1-9]|[1-4][0-9]|50)/(哦…) - 用于匹配的正则表达式
1通过55= >/([1-9]|[1-4][0-9]|5[0-5])/(没问题,我能做到……) - 用于匹配的正则表达式
1通过555= >/([1-9]|[1-9][0-9]|[1-4][0-9]{2}|5[0-4][0-9]|55[0-5])/(也许不是…) - 用于匹配的正则表达式
0001通过5555= >/(0{3}[1-9]|0{2}[1-9][0-9]|0[1-9][0-9]{2}|[1-4][0-9]{3}|5[0-4][0-9]{2}|55[0-4][0-9]|555[0-5])/(好吧,我明白了!)
这些数字是人为的,但它们也是非常基本的。在现实世界中,您可能需要动态地生成一个正则表达式来进行验证。
了解更多
如果你有兴趣了解更多 字符类 和其他正则表达式特性,我个人总是发现 regular-expressions.info 非常有用。
大量测试
截至2019年4月7日,该库运行 >1m测试断言 针对生成的regex范围提供强力验证结果是否正确。
在我的2.5 GHz Intel Core i7 MacBook Pro上,测试运行时间约为280毫秒。
优化
优化生成的正则表达式:
- 使用量词减少重复序列和字符类
- 足够聪明地使用
?当数字或范围可以是正数或负数时的条件 - 使用片段缓存来避免多次处理相同的字符串
用法
用下面的代码行将这个库添加到javascript应用程序中
const toRegexRange = require('to-regex-range');
主要导出是一个接受两个整数的函数: min 价值和 max 值(格式化为字符串或数字)。
const source = toRegexRange('15', '95');
//=> 1[5-9]|[2-8][0-9]|9[0-5]
const regex = new RegExp(`^${source}$`);
console.log(regex.test('14')); //=> false
console.log(regex.test('50')); //=> true
console.log(regex.test('94')); //=> true
console.log(regex.test('96')); //=> false
选项
options.capture
类型: boolean
Deafault: undefined
当有多个正则表达式条件时,将返回值用圆括号括起来。在动态生成范围时非常有用。
console.log(toRegexRange('-10', '10'));
//=> -[1-9]|-?10|[0-9]
console.log(toRegexRange('-10', '10', { capture: true }));
//=> (-[1-9]|-?10|[0-9])
options.shorthand
类型: boolean
Deafault: undefined
使用regex的简写 [0-9]:
console.log(toRegexRange('0', '999999'));
//=> [0-9]|[1-9][0-9]{1,5}
console.log(toRegexRange('0', '999999', { shorthand: true }));
//=> \d|[1-9]\d{1,5}
options.relaxZeros
类型: boolean
默认的: true
当范围填充零时,此选项放宽前导零的匹配。
const source = toRegexRange('-0010', '0010');
const regex = new RegExp(`^${source}$`);
console.log(regex.test('-10')); //=> true
console.log(regex.test('-010')); //=> true
console.log(regex.test('-0010')); //=> true
console.log(regex.test('10')); //=> true
console.log(regex.test('010')); //=> true
console.log(regex.test('0010')); //=> true
当 relaxZeros 为false,匹配严格:
const source = toRegexRange('-0010', '0010', { relaxZeros: false });
const regex = new RegExp(`^${source}$`);
console.log(regex.test('-10')); //=> false
console.log(regex.test('-010')); //=> false
console.log(regex.test('-0010')); //=> true
console.log(regex.test('10')); //=> false
console.log(regex.test('010')); //=> false
console.log(regex.test('0010')); //=> true
例子
| 范围 | 结果 | 编译时 |
|---|---|---|
toRegexRange(-10, 10) | -[1-9]|-?10|[0-9] | 132μs |
toRegexRange(-100, -10) | -1[0-9]|-[2-9][0-9]|-100 | 50μs |
toRegexRange(-100, 100) | -[1-9]|-?[1-9][0-9]|-?100|[0-9] | 42μs |
toRegexRange(001, 100) | 0{0,2}[1-9]|0?[1-9][0-9]|100 | 109μs |
toRegexRange(001, 555) | 0{0,2}[1-9]|0?[1-9][0-9]|[1-4][0-9]{2}|5[0-4][0-9]|55[0-5] | 51μs |
toRegexRange(0010, 1000) | 0{0,2}1[0-9]|0{0,2}[2-9][0-9]|0?[1-9][0-9]{2}|1000 | 31日μs |
toRegexRange(1, 50) | [1-9]|[1-4][0-9]|50 | 24μs |
toRegexRange(1, 55) | [1-9]|[1-4][0-9]|5[0-5] | 23μs |
toRegexRange(1, 555) | [1-9]|[1-9][0-9]|[1-4][0-9]{2}|5[0-4][0-9]|55[0-5] | 30μs |
toRegexRange(1, 5555) | [1-9]|[1-9][0-9]{1,2}|[1-4][0-9]{3}|5[0-4][0-9]{2}|55[0-4][0-9]|555[0-5] | 43μs |
toRegexRange(111, 555) | 11[1-9]|1[2-9][0-9]|[2-4][0-9]{2}|5[0-4][0-9]|55[0-5] | 38μs |
toRegexRange(29, 51) | 29|[34][0-9]|5[01] | 24μs |
toRegexRange(31, 877) | 3[1-9]|[4-9][0-9]|[1-7][0-9]{2}|8[0-6][0-9]|87[0-7] | 32μs |
toRegexRange(5, 5) | 5 | 8μs |
toRegexRange(5, 6) | 5|6 | 11μs |
toRegexRange(1, 2) | 1|2 | 6μs |
toRegexRange(1, 5) | [1-5] | 15μs |
toRegexRange(1, 10) | [1-9]|10 | 22μs |
toRegexRange(1, 100) | [1-9]|[1-9][0-9]|100 | 25μs |
toRegexRange(1, 1000) | [1-9]|[1-9][0-9]{1,2}|1000 | 31日μs |
toRegexRange(1, 10000) | [1-9]|[1-9][0-9]{1,3}|10000 | 34μs |
toRegexRange(1, 100000) | [1-9]|[1-9][0-9]{1,4}|100000 | 36μs |
toRegexRange(1, 1000000) | [1-9]|[1-9][0-9]{1,5}|1000000 | 42μs |
toRegexRange(1, 10000000) | [1-9]|[1-9][0-9]{1,6}|10000000 | 42μs |
小心!
参数顺序
当 min 大于 max,值将被翻转以创建一个有效的范围:
toRegexRange('51', '29');
有效地翻转为:
toRegexRange('29', '51');
//=> 29|[3-4][0-9]|5[0-1]
步骤/增量
此库不支持步骤(增量)。一个增加支持的公关将是受欢迎的。
历史
V2.0.0 - 2017-04-21
新功能
增加了对零填充的支持!
v1.0.0
优化
重复的范围现在使用量词进行分组。处理时间大致相同,但生成的正则表达式要小得多,这应该会导致更快的匹配。
归因
受到python库的启发 range-regex。
关于
贡献
拉请求和明星总是受欢迎的。对于bug和特性请求, 请创建一个问题。
运行测试
运行和审查单元测试是熟悉库及其API的好方法。可以使用以下命令安装依赖项并运行测试:
$ npm install && npm test
建立文档
(这个项目的自述。Md由 动词请不要直接编辑自述文件。对自述文件的任何更改都必须在 .verb.md 自述文件模板)。
使用实例生成自述文件。
$ npm install -g verbose/verb#dev verb-generate-readme && verb
相关项目
你也可能对这些项目感兴趣:
- expand-range:快速的,像猛击一样的范围扩张。展开数字或字母(大写或小写)的范围。使用…… 更多的 | 首页
- fill-range:填写数字或字母的范围,可选择传递一个增量或
step…… 更多的 | 首页 - micromatch: javascript/node.js的全局匹配。一个插入的替代品和更快的选择,以最小化匹配和多匹配。| 首页
- repeat元素:通过重复给定值n次来创建一个数组。| 首页
- repeat-string:重复给定字符串n次。重复字符串的最快实现。| 首页
贡献者
| 提交 | 贡献者 |
| --- | --- |
| 63 | jonschlinkert |
| 3 | doowb |
| 2 | realityking |
作者
Jon Schlinkert
请考虑在Patreon上支持我,或者 创建自己的Patreon页面!
许可证
版权所有©2019 Jon Schlinkert。 根据 麻省理工学院的许可。
该文件由 动词-生成-自述文件v0.8.0,于2019年4月7日发布。