1.使用正则表达式字面量
const reg = /[a-z]\d+[a-z]/i
2.使用RegExp构造函数
const alphabet = '[a-z]';
const reg = new RegExp(`${alphabet}\\d+${alphabet}`, 'i'); //内容,修饰符
const reg = new RegExp(`\d+`); //reg = /d+/
reg.test('1'); // false
reg.test('ddd'); // true
1.RegExp.prototype.test()
const reg = /[a-z]\d+[a-z]/i;
reg.test('a1a'); // true
reg.test('1a1'); // false
reg.test(Symbol('a1a')); // TypeError
2.RegExp.prototype.source 和 RegExp.prototype.flags
const reg = /[a-z]\d+[a-z]/ig;
reg.source; // "[a-z]\d+[a-z]"
reg.flags; // "gi"
source返回当前正则表达式的模式文本的字符串
flags返回当前正则表达式的修饰符的字符串,按字母升序排序(gimsuy)
3.RegExp.prototype.exec() 和 String.prototype.match()
const reg = /[a-z]\d+[a-z]/i;
reg.exec('a1a'); // ["a1a", index: 0, input: "a1a", groups: undefined]
reg.exec('1a1'); // null
'a1a'.match(reg); // ["a1a", index: 0, input: "a1a", groups: undefined]
'1a1'.match(reg); // null
RegExp.prototype.exec 要求输入字符串,遇到非字符串类型会尝试转换
String.prototype.match 要求输入正则表达式,遇到其它类型会先尝试转成字符串,再以字符串为 source 创建正则表达式
匹配成功,返回匹配结果
匹配失败,返回 null
当正则表达式含有 g 修饰符时,RegExp.prototype.exec 每次只返回一个匹配结果,数据格式和不含 g 修饰符相同。
String.prototype.match 会返回所有的匹配结果,数据格式会变为字符串数组。
由于 String.prototype.match 返回的数据格式不固定,因此大多数情况都建议使用 RegExp.prototype.exec
4.RegExp.prototype.lastIndex
const reg = /(a)/g;
const str = 'a1a';
reg.lastIndex; // 0
reg.exec('a1a'); // ["a", "a", index: 0, input: "a1a", groups: undefined]
reg.lastIndex; // 1
reg.exec('a1a'); // ["a", "a", index: 2, input: "a1a", groups: undefined]
reg.lastIndex; // 3
reg.exec('a1a'); // null
reg.lastIndex; // 0
当前正则表达式最后一次匹配成功的结束位置(也就是下一次匹配的开始位置)
注意:lastIndex 不会自己重置,只有当上一次匹配失败才会重置为 0 ,因此,当你需要反复使用同一个正则表达式的时候,请在每次匹配新的字符串之前重置 lastIndex!
5.String.prototype.replace()、String.prototype.search()、String.prototype.split()
'a1a'.replace(/a/, 'b'); // 'b1a'
'a1a'.replace(/a/g, 'b'); // 'b1b'
'a1a'.search(/a/); // 0
'a1a'.search(/a/g); // 0
'a1a'.split(/a/); // ["", "1", ""]
'a1a'.split(/a/g); // ["", "1", ""]
/[0-9]+/
不是全字符匹配,存在误判,如 /[0-9]+/.test(‘a1’) === true
[0-9]、\d匹配数字
[a-z] 匹配小写字母
[\u4e00-\u9fa5] 匹配汉字
+ 匹配一个或多个
/^\d+$/
不能匹配带符号的数值,不能匹配小数
^ 匹配字符串开始位置,当结合 m 修饰符时,匹配某一行开始位置
$ 匹配字符串结束位置,当结合 m 修饰符时,匹配某一行结束位置
/^[+-]?\d+(\.\d+)?$/
不能匹配无整数部分的小数,捕获组会带来额外开销
() 捕获组
? 作为限定符时表示匹配0到1个
. 匹配除换行符外任意字符
/^[+-]?(?:\d*\.)?\d+$/
不能匹配无小数部分的数值(2.),不能匹配科学计数法
(?:)
非捕获组
* 匹配0个或多个
这个 token 是 CSS 的 token,在 javascript 中,要多考虑一种情况
+'2.'; // 2
+'2.e1'; // 20
/^[+-]?(?:\d+\.?|\d*\.\d+)(?: e[+-]?\d+)?$/i
const reg = /[+-]?(?:\d*\.)?\d+(?:e[+-]?\d+)?(?=px|\s|$)/gi;
const reg = /(\d)(?=(\d{3})+(,|$))/g;
function formatCurrency(str) {
return str.replace(reg, '$1,');
}
const reg = /\d(?=(?:\d{3})+(?:,|$))/g;
function formatCurrency(str) {
return str.replace(reg, '$&,');
}
在es2018以上环境,可以使用反向环视
const reg = /(?<=\d)(?=(?:\d{3})+(?:,|$))/g;
function formatCurrency(str) {
return str.replace(reg, ',');
}
(?:)
的非捕获组形式color: #rrggbb;
color: #rgb;
color: #rrggbbaa;
color: #rgba;
正则
const hex = '[0-9a-fA-F]';
const reg = new RegExp(`^(?:#${hex}{6}|#${hex}{8}|#${hex}{3,4})$`);
color: rgb(r, g, b);
color: rgb(r%, g%, b%);
color: rgba(r, g, b, a);
color: rgba(r%, g%, b%, a);
color: rgba(r, g, b, a%);
color: rgba(r%, g%, b%, a%);
正则
const num = '[+-]?(?:\\d*\\.)?\\d+(?:e[+-]?\\d+)?';
const comma = '\\s*,\\s*';
const reg = new RegExp(`rgba?\\(\\s*${num}(%?)(?:${comma}${num}\\1){2}(?:${comma}${num}%?)?\\s*\\)`);
/* hsl & hsla */
color: hsl(h, s%, l%);
color: hsla(h, s%, l%, a);
color: hsla(h, s%, l%, a%);
/* keywords */
color: red;
color: blue;
/* …… */
const hex = '[0-9a-z]';
const hexReg = new RegExp(`^#(? ${hex})\\k(? ${hex})\\k(? ${hex})\\k(?${hex}?)\\k$`, 'i');
function shortenColor(str) {
return str.replace(hexReg, '#$$$$' );
}
console.log(shortenColor('#336600')); // '#360'
console.log(shortenColor('#19b955')); // '#19b955'
console.log(shortenColor('#33660000')); // '#3600'
解析URL
const protocol = '(?https?:)' ;
const host = '(?(?[^/#?:]+)(?::(?\\d+))?)' ;
const path = '(?(?:\\/[^/#?]+)*\\/?)' ;
const search = '(?(?:\\?[^#]*)?)' ;
const hash = '(?(?:#.*)?)' ;
const reg = new RegExp(`^${protocol}\/\/${host}${path}${search}${hash}$`);
function execURL(url) {
const result = reg.exec(url);
if (result) {
result.groups.port = result.groups.port || '';
return result.groups;
}
return {
protocol: '', host: '', hostname: '', port: '',
pathname: '', search: '', hash: '',
};
}
解析search和hash
function execUrlParams(str) {
str = str.replace(/^[#?&]/, '');
const result = {};
if (!str) {
return result;
}
const reg = /(?:^|&)([^&=]*)=?([^&]*?)(?=&|$)/y;
let exec = reg.exec(str);
while (exec) {
result[exec[1]] = exec[2];
exec = reg.exec(str);
}
return result;
}
Koa 无规范约束,不利于团队开发,中间件繁多,质量参差不齐,选择困难
Thinkjs
前端
服务端