# 规则
横向模糊匹配
/ab{1,3}c/g
纵向模糊匹配
/a[123]b/
[1-6a-fG-M]
要匹配- 要么换位置要么转义-
[^1-6a-fG-M] 取反
# 字符
字符组 | 具体含义 |
---|---|
\d | 表 记示 忆方式:其 [0-9]。表 英示 文是 是一digit 位数字 (数字) 。 。 |
\D | 表示 [^0-9]。表示除数字外的任意字符。 |
\w | 表 记示 忆方式: [0-9a-zA-Z_] w 是 word 。表的示数字、 简写,也大小写 称单词字字符 母和下 。 划线。 |
\W | 表示 [^0-9a-zA-Z_]。非单词字符。 |
\s | 表示 [ \t\v\n\r\f]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页 符。 记忆方式:s 是 space 的首字母,空白符的单词是 white space。 |
\S | 表示 [^ \t\v\n\r\f]。 非空白符。 |
. | 表示 [^\n\r\u2028\u2029]。通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符 除外。 记忆方式:想想省略号 … 中的每个点,都可以理解成占位符,表示任何类似的东西。 |
# 量词
量词 | 具体含义 |
---|---|
{m,} | 表示至少出现 m 次。 |
{m} | 等价于 {m,m},表示出现 m 次。 |
? | 等价于 {0,1},表示出现或者不出现。 记忆方式:问号的意思表示,有吗? |
+ | 等价于 {1,},表示出现至少一次。 记忆方式:加号是追加的意思,得先有一个,然后才考虑追加。 |
* | 等价于 {0,},表示出现任意次,有可能不出现。 记忆方式:看看天上的星星,可能一颗没有,可能零散有几颗,可能数也数不过来 |
# 贪婪 惰性
{1,3} 会去找超过3没
{1,3}? 惰性 有1就行了
# 多选
/good|nice/ 惰性的
# 匹配颜色
/#([0-9a-fA-F]{3}|#[0-9a-fA-F]{6})/g
# 写法
string.macth(reg)
reg.test(string)
# 小时
/^([01][0-9]|[2][0-3]):[0-5][0-9]$/
# 年月日
不精确
/^[0-9]{4}-([0][1-9]|[1][0-2])-([0][1-9]|[12][0-9]|[3][01])$/
# 电脑路径
/^[a-zA-Z]:\\([^\\:*<>|"?\r\n/]+\\)*([^\\:*<>|"?\r\n/]+)?$/
# 取id
/id="[^"]*"/
# 换行匹配
'hello\nioe\ndfwef'.replace(/^|$/gm, '#')
# 单词边界
\b 具体就是 \w 与 \W 之间的位置
\B 具体说来就是 \w 与 \w、 \W 与 \W、^ 与 \W,\W 与 $ 之间的位置
# (?=p) 和 (?!p)
正向先行断言和负向先行断言
p前面 取反
'hello'.replace(/(?<=l)/g, '#') 右边
(?!l) 取反
# 不匹配任何东西的正则
/.^/
# 数字的千位分隔符表示法
/\B(?=(\d{3})+\b)/
# 货币格式化
function format (num) {
return num.toFixed(2).replace(/\B(?=(\d{3})+\b)/, ',').replace(/^/, '$$ ')
}
# 括号引用 改年月日格式
let reg = /(\d{4})-(\d{2})-(\d{2})/
let string = '2017-05-12'
console.log(string.replace(reg, '$2/$3/$1')) // 05/12/2017
$123表示括号的分组 从1开始
reg里写
/(\d{4})(-|\/|\.)(\d{2})\2(\d{2})/
\2 同 外面的$2
括号嵌套时以左括号计算
\10表示第10个括号
反向引用以最后的匹配结果为准
# 非捕获括号 (?:p) 和 (?:p1|p2|p3)
# 模仿trim
trim (str) {
// return str.replace(/^\s+|\s+$/g, '')
return str.replace(/^\s*(.*?)\s*$/g, '$1')
},
# 首字母大写
titleize (str) {
return str.toLowerCase().replace(/(?:^|\s)\w/g, function (c) {
return c.toUpperCase()
})
},
# 大驼峰
camelize (str) {
return str.replace(/[-_\s]+(.)?/g, (match, c) => {
return c ? c.toUpperCase() : ''
})
},
c代表第一个组,可以一直往下加组
# 逆驼峰
dasherize (str) {
return str.replace(/([A-Z])/g, '-$1').replace(/[-_\s]+/g, '-').toLowerCase()
},
# html 转义
escapeHtml (str) {
const escapeChars = {
'<': 'lt',
'>': 'gt',
'"': 'quot',
'&': 'amp',
'\'': '#39'
}
return str.replace(new RegExp('[' + Object.keys(escapeChars).join('') + ']', 'g'), (match) => {
return '&' + escapeChars[match] + ';'
})
},
# 反转义
function unescapeHTML (str) {
var htmlEntities = {
nbsp: ' ',
lt: '<',
gt: '>',
quot: '"',
amp: '&',
apos: '\''
};
return str.replace(/\&([^;]+);/g, function (match, key) {
if (key in htmlEntities) {
return htmlEntities[key];
}
return match;
});
}
console.log( unescapeHTML('<div>Blah blah blah</div>') );
# 匹配成对标签
/<([^>]+)>[\d\D]*<\/\1>/
\1反向引用
# replace
属性 | 描述 |
---|---|
$1,$2,…,$99 | 匹配第 1-99 个 分组里捕获的文本 |
$& | 匹配到的子串文本 |
$` | 匹配到的子串的左边文本 |
$' | 匹配到的子串的右边文本 |
$$ | 美元符号 |
# regex.source
看写的究竟是什么
# 判断数据类型
var utils = {};
"Boolean|Number|String|Function|Array|Date|RegExp|Object|Error".split("|").forEach(fun
ction (item) {
utils["is" + item] = function (obj) {
return {}.toString.call(obj) == "[object " + item + "]";
};
});
console.log( utils.isArray([1, 2, 3]) );