正则表达式
-
正则表达式解释:正则表达式(英语:regular Expression, 常简写为regex、regexp或RE),又称正则表达式、正则表示法、规则表达式、常规表示法,是计算机的一个概念。
- 正则表达式使用单个字符来描述,匹配一系列匹配某个句法规则的字符串。许多程序设计语言都支持正则表达式进行字符串操作
-
简单概况:正则表达式是一种字符串匹配利器,可以帮助我们搜索,获取,代替字符串;
-
在javascript中,正则表达式使用RegExp类来创建,也有对应的字面量的方式;
- 正则表达式主要由两部分组成:模式(patterns)和修饰符(flags)
-
1 const re1 = new RegExp("abc"); 2 const re2 = /abc/;//字面量
-
正则表达式的使用方法
-
修饰符flag的使用
- 常见的修饰符:g:全部、全部匹配;i:忽略大小写;m:多行匹配;
-
规则-字符类(反向类把字母都变成大写)
- 字符类是一个特殊的符合,匹配特定集中的任何符合。
- \d:数字从0到9的字符。
- \s:空格符号:包括空格,制表符\t,换行符\n其他少数稀有字符
- \w:“单字”字符:拉丁字母或者数字下划线—
- .(点):点.是一种特殊字符,他除了换行符,可以匹配任何字符
-
规则-锚点
- 符号^和符号$在正则表达式中具有特殊意义,他们被称为“锚点”;
- 符号^匹配文本开头。
- 符号$匹配文本末尾。
- 词边界:\b是一种检查,就像^和$一样,它会检查字符串中的位置是否是词边界。(就是词的两边是否有东西),词边界测试\b检查位置的一侧是否匹配\w,而另一侧则不匹配“\w”
-
规则—转义
- 如果要想把特殊字符作为常规字符来使用,需要对其进行转义:只需要在它的前面加个反斜杠就可以了
- 常见需要转义的字符:[]、\、$、.、|、?、*、+、()、
-
集合(sets)和范围(ranges)
- 在方括号[....]中的几个字符或者字符类意味着“搜索给定的字符中的任意一个”;
- 集合
- 例如[qwe]意味着查找3个字符中的任意一个;
- 范围
- 方括号也可以包含字符范围
- 比如[a-z],[0-5];
- [0-9A-F]表示两个范围;
- \d和[0-9]相同;
- \w-和[a-zA-Z0-9]相同;
- 排除范围在普通[]范围l前面加上^;[]里面最前面
-
量词
- 用来形容我们所需要的数量的词被称为量词
- 数量
- 确切的位数:{5};5位数
- 某个范围的位数:{3,5}
- 缩写
- +:代表“一个或多个”,相当于{1,}
- ?:代表“零个或一个”,相当于{0,1},换句话说,它使得符号变得可选;
- *:代表“零个或者多个”,相当于{0,}也就是说,这个字符可以出现多次,或者不出现
-
贪婪(Greedy)和惰性(lazy)模式
- 贪婪模式是默认模式,匹配规则是查找到匹配的内容后会继续向后查找一直找到最后一个匹配的内容。.+
- 惰性模式是.+?:只要获取对应的内容,就不再继续向后匹配;就在量词后面加一个?来启动惰性模式
-
捕获组
- 模式的一部分可以用括号括起来(...),这称为“捕获组”,
- 它允许匹配的一部分作为结果数组中的单独项;
- 它将括号视为一个整体;
- 方法str.match(regexp),如果regexp没有g标志,将查找第一个匹配并将它作为一个数组返回:
- 在索引0处:完全匹配
- 在索引1处:第一个括号内容
- 在索引2处:第二个括号内容
- 命名组
- 用数字记录很困难。给括号起个名字,在开始括号之后立即放置?<name>来完成的。
- 非捕获组
- 有时我们需要括号才能正确的对应量词,但是我们不希望他们的内容出现在结果中
- 可以通过在开头添加?:来排除组。
- or是正则表达式中的一个术语,实际上是一个简单的或。
- 在正则表达式中,它用竖线 | 表示;
- 通常会和捕获组一起来使用,其中表示多个值;
- 时间格式化
-
1 function datetime(timestamp, fmtst) { 2 //封装时间工具 3 const date = new Date(timestamp); //将时间戳转为时间 4 const date0 = { 5 //为了方便一一对应,把正则转换成键名 6 "y+": date.getFullYear(), 7 "M+": date.getMonth() + 1, 8 "d+": date.getDate(), 9 "h+": date.getHours(), 10 "m+": date.getMinutes(), 11 "s+": date.getSeconds(), 12 }; 13 for (const key in date0) { 14 //遍历对象 15 const keyre = new RegExp(key); //因为多次使用正则,把正则变为常量 16 17 if (keyre.test(fmtst)) { 18 //判断传入的格式是否跟正则一致 19 const value = (date0[key] + "").padStart(2, "0"); //将日期转为字符串,然后个位数补零 20 fmtst = fmtst.replace(keyre, value); //替换字符串格式 21 } 22 } 23 return fmtst; //输出最终结果 24 } 25 26 h2.textContent = datetime(1685404800000, "yyy-MMM-dd hh:mm:ss"); //传入时间戳跟时间格式
-