1.怎么学习和使用
4步走流程:
- 做分解
- 分析各个子问题
- 套皮
- 调试
克制使用正则
-
能用普通字符串解决的,坚决用普通字符串解决
-
能写注释的正则表达式,一定要写注释
-
能写多个正则表达式解决的,不要苛求用一个复杂的正则表达式解决
2.元字符
- 特殊单字符:
- .:任意字符(换行除外)
- \d:任意数字、\D:任意非数字
- \w:任意字母数字下划线、\W:任意非字母数字下划线
- \s:任意空白符、\S:任意非空白符
- 空白符:
- \r:回车符
- \n:换行符
- \f:换页符
- \t:制表符
- \v:垂直制表符
- \s:任意空白符
- 量词
- *:0到多次
- +:1到多次
- ?:0到1次,入colou?r
- {m}:出现m次
- {m,}:出现至少m次
- {m,n}:m到n次
- 范围
- |或,:如ab|bc代表ab或者bc
- […]:多选一,括号中任意单个元素
- [a-z]:匹配a到z之间任意单个元素
- [^...]:取反,不能是括号中的任意单个元素
3.量词与贪婪
如果只是判断文本是否符合规则,则可以使用独占模式; 如果需要获取匹配的结果,则根据需要使用贪婪或非贪婪。
- 贪婪模式:正则中量词默认是贪婪匹配,尽可能多的匹配。
- 非贪婪模式:非贪婪匹配需要在量词后面加上问号。尽可能少的匹配。
- 独占模式:量词后面加上+,也是进行贪婪匹配,不会进行回溯,性能好,但不一定可以满足需求,还要看语言是否支持。
4.分组与引用
- 分组和子组编号,括号可以将某部分括起来,看成一个整体,也可以保存为一个子组,在后续查找替换的时候使用,例如第一组,可以使用\1,在JavaScript中以$1表示为第一组。如果不想保持为子组,则在括号里加上?:。
- 分组命名规则:(?P<名称>正则)
5.匹配模式
- 不区分大小写模式:模式修饰符(?i),在js中使用/regex/i 来指定匹配模式。
- 点号通配模式:模式修饰符(?s),在js中不支持此模式。
- 多行模式:模式修饰符(?m),为了使^和$能匹配每行的开头和结尾。
- 注释模式:(?#comment)
6.断言
-
单词边界:\b
-
行的开始/结束:^表示行开始,$表示行结束
-
环视:环视不会被保存成子组,环视只匹配位置,不匹配内容。
正则 名称 含义 示例 (?=Y) 肯定顺序环视 右边是Y six(?=\d)右边是数字的six,能匹配six6 (?!Y) 否定顺序环视 右边不是Y hi(?!\d)
右边不是数字的hi,能匹配hight(?<=Y) 肯定逆序环视 左边是Y (?<=\d)th
左边是数字的th,能匹配9th(?<!Y) 否定逆序环视 左边不是Y (?<!\d)th
左边不是数字的th,能匹配health
7.转义
- 转义字符:对它后续的几个字符进行替代并解释,其功能如下
- 编码无法用字母表直接表示的特殊数据
- 表示无法直接键盘录入的字符(如回车符)
- 字符串转义和正则转义
- 字符串转义:输入字符串到字符串文本的过程
- 正则转义:正则文字到正则表达式的过程
- 匹配反斜杠本身需要4个\
- 简化方式:使用原生字符串
- 元字符的转义:
- 元字符的转义一般在前面加反斜杠
- 方括号[]和花括号{}一般转义开括号,但圆括号()需要2个都转义。
- 字符组中的转义
- 脱字符^在中括号中,且在第一个位置
- 中划线在中括号中,且不在首尾位置
- 右括号在中括号中,且不在首位
- 其他单个长度的元字符一般不需要转义
8.常用正则表达式
1.千分位
Number.prototype.formatThousand = function () {
if (!this) {
return '0';
}
// 先转成字符串
let num = String(this);
const reg = num.indexOf('.')!== -1 ? /(\d)(?=(?:\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g;
return num.replace(reg, '$1,');
}
let num = 123456.789;
num.formatThousand();