25、正则表达式

正则表达式

文章目录

课前补充

转义字符\

<script type="text/javascript">
 // 表示反斜杠后面的引号就是普通引号而已 不影响字符串的引号成对
	var str = "abcd\"edf";
</script>
image-20221016152657301

多行字符串

// 系统规定字符串不能多行显示
<script type="text/javascript">
    var test = "\
    <div></div>\
    <span></span>\
    ";
    console.log(test);        
</script>

字符串换行符\n

<script type="text/javascript">
    // \n换行
	var str = "abcd\nedf";
</script>
转义字符字符值输出结果
\’一个单撇号(')输出单撇号字符’
\"一个双撇号(")输出双撇号字符"
?一个问号(?)输出问号字符?
\\一个反斜杠()输出反斜杠字符\
\a警告(alert)产生声音或视觉信号
\b退格(backspace)将光标当前位置后退一个字符
\f换页(from feed)将光标当前位置移到下一页的开头
\n换行将光标当前位置移到下一页的开头
\r回车(carriagereturn)将光标当前位置移到本行的开头
\t水平制表符将光标当前位置移到下一个Tab位置
\v垂直制表符将光标当前位置移到下一个垂直表对齐点
\o、\oo、\ooo其中o表示一个八进制数字与该八进制对应的ASCII字符与该八进制码对应的字符
\xh[h…]其中h表示一个十六进制数字与该十六进制对应的ASCII字符与该十六进制码对应的字符

正则表达式

正则表达式的作用:

匹配特殊字符或有特殊搭配原则的字符的最佳选择。

正则表达式是构成*搜索模式(search pattern)*的字符序列。

当您搜索文本中的数据时,您可使用搜索模式来描述您搜索的内容。

正则表达式可以是单字符,或者更复杂的模式。

正则表达式可用于执行所有类型的文本搜索文本替换操作。

两种创建方式

直接量(推荐)
<script type="text/javascript">
    var reg = /abc/;  // 这就创建了一个正则表达式abc
	// 正则表达式会验证一下字符串内有没有规定的片段abc(顺序大小写都得一致)
	var str = "abcd";
</script>

调用test方法 有就返回true 没有就返回false

image-20221016161636272

/pattern/i; i是修饰符(把搜索修改为大小写不敏感,也就是忽视大小写)。

<script type="text/javascript">
    var reg = /abcd/i;
	var str = "ABCD";
</script>
image-20221016162239844
new RegExp();
<script type="text/javascript">
    var str = "abcd";  // 字符串abcd
    var reg = new RegExp("abc"); // 正则表达式abc
</script>
image-20221016163313557
<script type="text/javascript">
    var str = "aBcD"; 
    var reg = new RegExp("abc","i"); // 忽略大小写
</script>
<script type="text/javascript">
    var str = "aBcD"; 
    var reg = new RegExp("abc","i");
	// 通过这种方式复制一个一样的正则表达式
	var reg1 = new RegExp(reg); // 如果这里不写new  那就是指向同一个reg  因为表示的是正则表达式的引用
</script>
image-20221016164716638

正则表达式修饰符

修饰符可用于大小写不敏感的更全局的搜素:
修饰符描述试一试
i执行对大小写不敏感的匹配。(忽略大小写)试一试
g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。试一试
m执行多行匹配。试一试
<script type="text/javascript">
    var reg = /ab/gi; // 全局匹配 忽略大小写
    var str = "ababababab";
    console.log(str.match(reg));
</script>
image-20221016165748356
reg = /ab/mgi
<script type="text/javascript">
    var reg = /a/g;  // 这么匹配a能匹配两个
    var str = "abcdea";
    console.log(str.match(reg));
</script>
image-20221016170140732
<script type="text/javascript">
    // 匹配以a开头的字符串的a 这样只有一个
    var reg = /^a/g;  
    var str = "abcdea";
    console.log(str.match(reg));
</script>
image-20221016170300890
<script type="text/javascript">
    var reg = /^a/g;  
    // 在字符串之后加换行符也还是只有一个
    // 因为没有多行匹配的功能 认为\n和字符串是一个整体
    var str = "ab\ncdea"; 
    console.log(str.match(reg));
</script>
<script type="text/javascript">
    var reg = /^a/gm;  
    // 加上多行匹配符m之后才有多行匹配的功能 然后匹配出两个a
    var str = "abcde\na"; 
    console.log(str.match(reg));
</script>
image-20221016170757187

正则表达式模式

正则表达式上的方法test():

​ 判断字符是否符合要求,返回true和false

字符串上的方法match():

​ 可以把所有东西匹配出来并返回,更加直观

括号用于查找一定范围的字符串:
表达式描述
[abc]查找方括号之间的任何字符
[^abc]查找任何不在方括号之间的字符
[0-9]查找任何从0-9的数字
[a-z]查找任何从小写a到小写z的字符
[A-Z]查找任何从大写A到大写Z的字符
[A-z]查找任何从大写A到小写z的字符
[adgk]查找给指定集合内的任何字符
[^adgk]查找给指定集合外的任何字符
(x|y)查找由|分割的任何选项(或)
<script type="text/javascript">
    // 表示在全局中匹配三个数字相邻 只会匹配前三位
    // 比如这123匹配成功就不会往后继续看数字09了 而是看字母后的三个数字相连的数987
    var reg = /[0-9][0-9][0-9]/g; 
    var str = "12309u98723zpoixcuypiouqwer";
    console.log(str.match(reg));
</script>
image-20221016173907607
<script type="text/javascript">
    // 第一个只能在ab取值 第二个只能在cd取  第三个只能取d
    var reg = /[ab][cd][d]/g;
    var str = "abcd";  // 取的数满足范围的同时还要注意顺序
    console.log(str.match(reg));
</script>

image-20221016174311840

<script type="text/javascript">
    var reg = /[0-9A-z][cd]d/g;
    var str = "ab1cd";
    console.log(str.match(reg));
</script>
image-20221016174646238

[^] 不加[]是代表开头 加[]表示非

<script type="text/javascript">
    var reg = /[^a][^b]/g; // 第一位不是a  第二位不是b
    var str = "ab1cd";  // b1和cd
    console.log(str.match(reg));
</script>
image-20221016174944369

(x|y) 查找由 | 分隔的任何选项 意思就是x或y的意思。

<script type="text/javascript">
    var reg = /(a|b)/g; // 只写a|b就会把ab都匹配出来
    var str = "ab1cd";
    console.log(str.match(reg));
</script>
image-20221016175249274
<script type="text/javascript">
    // 第一位 a或b  第二位范围是bc 第三位0-9 所以是ab1
    var reg = /(a|b)[bc][0-9]/g;
    var str = "ab1cd";
    console.log(str.match(reg));
</script>
image-20221016175506259
元字符(Metacharacter)是拥有特殊含义的字符:
元字符取值区间描述
.[^\r\n]查找单个字符,除了换行和结束符
\w[0-9A-z_]查找单词字符
\W[^\w]查找非单词字符
\d[0-9]查找数字字符
\D[^\d]查找非数字字符
\s[\t\n\r\v\f加空格]查找空白字符
\S[^\s]查找非空白字符
\b单词边界匹配单词边界
\B非单词边界匹配非单词边界
\0查找NUL字符
\n查找换行符
\f查找换页符
\r查找回车符
\t查找制表符
\v查找垂直制表符
\xxx查找以八进制数xxx规定的字符
\xdd查找十六进制数dd规定的字符
\uxxxx查找以十六进制数xxxx规定的Unicode字符
\w和\W \w查找单词字符 \W查找非单词字符

\w === [0-9A-z_] \w代表的是0-9和字母大小写和下划线的区间

<script type="text/javascript">
    // 第一位取值范围[0-9A-z_] 后面几位是b1cd
    var reg = /\wb1cd/g; 
    var str = "ab1cd";
    console.log(str.match(reg));
</script>
image-20221016204034248

\W === [^\w] \W代表的是除了0-9和字母大小写和下划线的其他区间

<script type="text/javascript">
    // 第一位取值范围是除了[0-9A-z_]的区间 后面几位是b1cd
    var reg = /\Wb1cd/g; 
    var str = "ab1cd";
    console.log(str.match(reg));
</script>

找不到会返回null

image-20221016204133225

<script type="text/javascript">
    // 第一位取值范围是除了[0-9A-z_]的区间 后面几位是b1cd
    var reg = /\Wb1cd/g; 
    var str = "a@b1cd";
    console.log(str.match(reg));
</script>
image-20221016204230008
\d和\D \d查找数字字符 \D查找非数字字符

\d === [0-9] 表示取值区间是0-9

<script type="text/javascript">
    var reg = /\dcd/g;  // 第一位区间是0-9 后面两位是cd
    var str = "ab1cd";  // 能取出1cd
    console.log(str.match(reg));
</script>
image-20221016205332413

\D === [^\d] 表示取值区间是除了0-9的其他区间

<script type="text/javascript">
    var reg = /\D1c/g; 
    var str = "ab1cd";
    console.log(str.match(reg));
</script>
image-20221016205516632
\s和\S \s查找空白字符 \S查找非空白字符

空白符

image-20221016210249452

\s === [\t\n\r\v\f加空格]

\S === [^\s]

\b和\B \b匹配单词边界 \B匹配非单词边界
<script type="text/javascript">
    var reg = /\bcde/g;  // \bc是指匹配c是单词边界 后面跟的单词
    var str = "abc cde fgh";  // 6个单词边界 头尾各两个
    console.log(str.match(reg));
</script>
image-20221016210813485
<script type="text/javascript">
    var reg = /\bcde\B/g;  // c是单词边界后面跟de和非边界的单词
    var str = "abc cdefgh"; // h这么写就不是边界了
    console.log(str.match(reg));
</script>
image-20221016211057087
\t 只能匹配在字符串中出现的\t(制表符)
<script type="text/javascript">
    var reg = /\tc/g; // 匹配制表符后面跟了个c
    var str = "abc\tcdefgh";
    console.log(str.match(reg));
</script>
image-20221016211602759
\n 也是只能匹配字符串中出现的\n(换行符)
<script type="text/javascript">
    var reg = /\nc/g; // 匹配换行符后面跟了个c
    var str = "abc\ncdefgh";
    console.log(str.match(reg));
</script>
image-20221016211825299

. === [^\r\n] 能匹配除回车符和换行符的区间。

<script type="text/javascript">
    // .能匹配除回车符和换行符的区间
    var reg = /. /g;
	// 加空格也能识别出来
    var str = "我们会一直好下去,会在一起很久很久。";
    console.log(str.match(reg));
</script>

image-20221016214508588

Unicode编码拓展
Unicode表达形式
  1. \u0000 (十六进制)
  2. \u0affff (十六进制)
  3. \u101abe

分层展示

前两位代表不同的层 后四位撑死代表Unicode代表的范围

\u010000 - \u01ffff

\u020000 - \u02ffff

\u100000 - \u10ffff

\uxxxx 查找以十六进制数xxxx规定的Unicode字符

<script type="text/javascript">
    // 这个Unicode就是我们会一直好下去的编码
    var reg = /\u6211\u4eec\u4f1a\u4e00\u76f4\u597d\u4e0b\u53bb/g;
    var str = "我们会一直好下去,会在一起很久很久。";
    console.log(str.match(reg));
</script>
image-20221016213111635

\uxxxx 也有区间 区间[\u0000-\uffff]就包含了所有字符 能匹配一切

<script type="text/javascript">
	// 这里换成编码区间
    var reg = /[\u3000-\ua000]/g;
    var str = "我们会一直好下去,会在一起很久很久。";
    console.log(str.match(reg));
</script>

区间生效了 但是会把文字分开

image-20221016213450715

\s和\S组合也能匹配所有字符
<script type="text/javascript">
    var reg = /[\s\S]/g;
    var str = "我们会一直好下去,会在一起很久很久。";
    console.log(str.match(reg));
</script>

image-20221016213901521

\d和\D组合也能匹配所有字符
<script type="text/javascript">
    var reg = /[\d\D]/g;
    var str = "我们会一直好下去,会在一起很久很久。";
    console.log(str.match(reg));
</script>

Quantifiers 定义量词:
量词听得懂的描述n匹配区间官方描述
n+n是个变量,一次可以匹配1到无数个符合条件的值{1,+∞}匹配任何包含至少一个n的字符串
n*一次可以匹配0到无数个符合条件的值{0,+∞}匹配任何包含零个或多个n的字符串
n?一次可以匹配0到1个符合条件的值{0,1}匹配任何包含零个或一个n的字符串
n{X}{3}这样就是符合条件的值3个3个匹配{X}匹配包含X个n的序列的字符串
n{X,Y}x-y个进行匹配,{1,3}这样就是一次匹配1-3个符合条件的值{X,Y}匹配包含X至Y个n的序列的字符串
n{X,}每次最少匹配x个符合条件的值{X,+∞}匹配包含至少X个n的序列的字符串
n$判断最后一位是否在取值区间,在则返回该值,不在则是null匹配任何结尾为n的字符串
^n判断第一位是否在取值区间,在则返回该值,不在则是null匹配任何开头为n的字符串
?=n匹配任何其后紧接指定字符串n的字符串
?!n匹配任何其后没有紧接指定字符串n的字符串
贪婪匹配原则:

能一起匹配出来绝不一个个取值,就好比下面的a1c@32d 会先匹配出一组a1c 再匹配后面那组符合条件的32d 要是去掉@ 会把a1c32d全部返回在一组数上 能全部返回就不会一个个返回

非贪婪匹配:

能少取就别多取 实现就是在两次后面加一个问号?

<script type="text/javascript">
    var reg = /\w+?/g;  // w的取值区间是[0-9A-z_]
    var str = "a1c@32d";
    console.log(str.match(reg));
</script>

贪婪匹配会把a1c 32d以两组返回 非贪婪模式能少就不多 所以每次只返回一个

image-20221019054646812
n+ 一次可以匹配1到无数个符合条件的值
<script type="text/javascript">
    var reg = /\w+/g;  // w的取值区间是[0-9A-z_]
    var str = "a1c@32d";
    console.log(str.match(reg));
</script>
image-20221017061704620
n* 一次可以匹配0到无数个符合条件的值
<script type="text/javascript">
    var reg = /\w*/g;  // w的取值区间是[0-9A-z_]
    var str = "abc";
    console.log(str.match(reg));
</script>

光标在abc之前停留的时候会判断后面的数是否能识别 能识别就返回那个数

注意还有一个空串 这是因为abc选出后光标在c后面 还有一段逻辑距离

没有满足条件的值还会匹配出一个空字符出来

image-20221017062018724
<script type="text/javascript">
    var reg = /\d*/g;  // d的取值区间是[0-9]
    var str = "abc";
    console.log(str.match(reg));
</script>

所以找不到符合条件的就会匹配四个空字符出来(因为有光标定位点 光标在a之前匹配不到就返回空 b之前也匹配不到返回空 c之后和c之后的光标定位点都返回空)

image-20221017062632783
n? 一次可以匹配0到1个符合条件的值

所以这里的返回值都是单个单个返回

<script type="text/javascript">
    var reg = /\w?/g;  // w的取值区间是[0-9A-z_]
    var str = "abc@123";
    console.log(str.match(reg));
</script>

最后也是有一个空字符 最后一个光标定位点匹配不到就返回空

image-20221017064131181
n{X} 几个几个匹配 凑不够指定个数的时候不匹配
<script type="text/javascript">
    var reg = /\w{3}/g;  // w区间[0-9A-z_] 3个3个匹配
    var str = "abcadjladlajdajdlajason";
    console.log(str.match(reg));
</script>

最后的on不足三位 不进行匹配

image-20221017065039119
n{x,y} x-y个进行匹配 优先匹配y个 不足y个再匹配x个
<script type="text/javascript">
    var reg = /\w{1,3}/g; // 这里{}后面也可以加? 非贪婪模式  只匹配一个
    var str = "abcadjladlajdajdlajason";
    console.log(str.match(reg));
</script>

能三个匹配就三个匹配 最后不足三位的地方也能匹配上

image-20221017065419311
n{X,} 每次最少匹配x个符合条件的值

然后根据贪婪原则会优先匹配多的 那都是会把所有的数取出来的 都是全取出来了

<script type="text/javascript">
    var reg = /\w{1,}/g;
    var str = "abcadjladlaj@dajdlajason";
    console.log(str.match(reg));
</script>

这里是加了@隔断了 所以取出了两组数 这个跟n+ n* 差不多

image-20221017070308384
n$ 判断最后一位是否在取值区间,在则返回该值,不在则是null
<script type="text/javascript">
    var reg = /\w$/g;
    var str = "abc";
    console.log(str.match(reg));
</script>
image-20221017203313107
<script type="text/javascript">
    var reg = /\w$/g;
    var str = "abc@";  // 加个@
    console.log(str.match(reg));
</script>

最后一位不满足\w条件 所以返回null

image-20221017203355397

^n 匹配任何开头为n的字符串
<script type="text/javascript">
    var reg = /^\w/g;
    var str = "abc@";
    console.log(str.match(reg));
</script>
image-20221017203649723

第一位不满足\w条件 所以返回null

<script type="text/javascript">
    var reg = /^\w/g;
    var str = "@abc";  // 头部加@
    console.log(str.match(reg));
</script>
image-20221017203805608
<script type="text/javascript">
    var reg = /^abc$/g; // 以abc开头也以这个abc结尾
    var str = "abcabc";
    console.log(str.match(reg));
</script>

这里的以abc开头 以abc结尾的abc是同一个abc 不是两个 所以返回null 所以开头就是结尾 把内容限定死了

image-20221017204406527
?=n 正向预查/正向断言:匹配任何其后紧接指定字符串n的字符串
<script type="text/javascript">
    var reg = /a(?=b)/g;
    var str = "abaaaa";
    console.log(str.match(reg));
</script>

取出后面紧跟着b的a (只取出a 不取出b b只是修饰)

image-20221019054221532
?!n 非正向预查:匹配任何其后没有紧接指定字符串n的字符串
<script type="text/javascript">
    var reg = /a(?!b)/g;
    var str = "abaaaa";
    console.log(str.match(reg));
</script>

查出后面没有紧跟着b的a

image-20221019054331752
练习
写一个正则表达式,检验字符串首尾是否含有数字?
<script type="text/javascript">
    var reg = /^\d|\d$/g; // 第一位或者最后一位是数字
    // 首尾都满足就都取该位 \d一次只能取一位  别忘了
	var str = "123abc123";
    console.log(str.match(reg));
</script>
image-20221017204933051
写一个正则表达式,检验字符串首尾是否含有数字?
<script type="text/javascript">
    // 第一位和最后一位是数字 中间取任意位任意数 (\s\S可取所有字符)
    var reg = /^\d[\s\S]*\d$/g; 
	var str = "123abc123";
    console.log(str.match(reg));
</script>
image-20221017205824063

RegExp对象属性

属性描述火狐
globalRegExp对象是否具有标志g。1
ignoreCaseRegExp对象是否具有标志i。1
lastIndex一个整数,标示开始下一次匹配的字符位置。1
multilineRegExp对象是否具有标m。1
source正则表达式的源文本。1
<script type="text/javascript">
    var reg = /^\d[\s\S]*\d$/gmi;
	var str = "123abc123";
    console.log(str.match(reg));
</script>

有gmi 所以gmi相关的三个属性都返回true reg.source就是正则表达式的内容 lastIndex就是下一次匹配开始的位置 具体看后面结合reg.exec()使用

image-20221017210815557

RegExp对象方法

方法描述火狐
compile编译正则表达式1
exec检索字符串中指定的值。返回找到的值,并确定其位置。1
test检索字符串中指定的值。返回true或false。1
<script type="text/javascript">
    var reg = /^\d[\s\S]*\d$/gmi; 
	var str = "123abc12@1";
    console.log(str.match(reg));
</script>
test

检索字符串中指定的值。返回true或false。

reg.compile 就是获取正则表达式的内容
image-20221019070037524

reg.exec();

lastIndex

lastIndex就是光标 lastIndex就是为了exec方法而存在的

<script type="text/javascript">
    var reg = /ab/g;
    var str = "abababab";
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    </script>

依次索引:

第一次取的是光标位置在0-1的ab(第一对) 取完之后光标在第二位上

第二次取的是光标2-3的ab(第二对)取完之后光标在第四位上

第三次取的是光标4-5的ab(第三对)取完之后光标在第六位上

第四次取的是光标6-7的ab(第四对)取完之后光标在第八位上

第五次取的时候光标在的位置在b后面 没有内容 所以匹配的是null

然后继续打印又重复从光标0-1开始匹配ab

image-20221017213107513

不加\g的话 lastIndex光标永远在第0位 永远从第0位开始索引

<script type="text/javascript">
    // 不加\g的话 lastIndex光标永远在第0位 永远从第0位开始索引
    var reg = /ab/;
    var str = "abababab";
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    </script>
image-20221017220436484
匹配xxxx形式的数据

四个一样的值都能匹配出来

(子表达式)\1 括号会记录子表达式里面的内容 然后通过\1反向引用第一个第一个子表达式里面的内容

// 匹配四个a
<script type="text/javascript">
    var reg = /(\w)\1\1\1/g; // 注意 括号别忘了
    var str = "aaaa";
    console.log(reg.exec(str));
    </script>
image-20221018214029143
匹配aabb形式的数据
// 匹配aabb
<script type="text/javascript">
    var reg = /(\w)\1(\w)\2/g; // b是引用第二个子表达式的内容 (\w){2}(\w){2} 这样写也可以
    var str = "aabb";
    console.log(reg.exec(str));
    </script>

a是第一位子表达式内容 b是第二位子表达式内容

image-20221018214314698

支持正则表达式的String对象方法

方法描述火狐
search检索与正则表达式相匹配的值1
match找到一个或多个正则表达式的匹配1
replace替换与正则表达式匹配的子串1
split把字符串分割为字符串数组1
match 找到一个或多个正则表达式的匹配
<script type="text/javascript">
    var reg = /(\w)\1(\w)\2/g;
    var str = "aabb";
    // 注意是string方法 所以是str.match(reg) reg和str位置互换一下
	console.log(str.match(reg));
    </script>

加g 只返回匹配出的内容

image-20221018215553108

不加g 返回的结果类似exec

image-20221018215918499
search 检索与正则表达式相匹配的值
<script type="text/javascript">
    var reg = /(\w)\1(\w)\2/g;
    var str = "aabb";
    console.log(str.search(reg));
    </script>

返回的是匹配到数据所在的位置(光标在0位就匹配到了就返回0) 匹配不到数据就返回-1

image-20221018220624525
<script type="text/javascript">
    var reg = /(\w)\1(\w)\2/g;
    var str = "eiqvaabb"; 
    console.log(str.search(reg));
</script>

由于\1或者\2都是引用子表达式的内容 所以前提就是子表达式中的内容存在连续且重复 所以光标匹配到a时 光标所在位置是4(光标下标从0开始) 所以返回4

image-20221018221611185
split 把字符串分割为字符串数组
<script type="text/javascript">
    var reg = /\d/g; // 数字作为分隔符
    var str = "ei1qva3ab5b";
    console.log(str.split(reg));
</script>

情况比较复杂 可以自己多加练习

image-20221018222520236
replace 替换与正则表达式匹配的子串
<script type="text/javascript">
    var str = "aa";
	console.log(str.replace("a", "b"));
</script>

非正则表达式的缺陷 只能访问一个 没有访问全局的能力 所以只能把第一个a替换成b 返回ba

image-20221018223314963
<script type="text/javascript">
    var reg = /a/g;  // 不写g依旧返回ba  因为不是全局
    var str = "aa";
	console.log(str.replace(reg, "b"));
</script>

返回bb 因为加g之后 具有全局访问能力 所以可以替换与正则表达式匹配的子串 所以返回bb

image-20221018223703435

aabb形式的字符改成bbaa 方法一

<script type="text/javascript">
    var reg = /(\w)\1(\w)\2/g;  // 不写g依旧返回ba  因为不是全局
    var str = "aabb";
	// $1代表第一个子表的内容  $2代表第二个子表达式的内容
	console.log(str.replace(reg, "$2$2$1$1")); 
</script>
image-20221018224216958

方法二

<script type="text/javascript">
    var reg = /(\w)\1(\w)\2/g;
    var str = "aabb";
	// 第一个参数是匹配的内容 这里就是aabb 第二个参数是第一个子表达式的内容  第三个参数是第二个子表达式的内容
	console.log(str.replace(reg, function ($,$1,$2) {
        return $2 + $2 + $1 + $1; // 返回的字符串替换匹配内容
    })); 
</script>
image-20221018225033828

toUpperCase() 把字符串变大写

toLowerCase() 把字符串变小写

image-20221018224832620
练习:

the-first-name 变成小驼峰式写法(theFirstName)

<script type="text/javascript">
    var reg = /-(\w)/g; // 匹配-f和-n 把\w圈起来表示子表达式  然后通过$1引用
    var str = "the-first-name";
	console.log(str.replace(reg, function ($,$1) {
        return $1.toUpperCase();
    })); 
</script>

注意 $1表示的是第一个子表达式的内容 而这个子表达式就包含了-f和-n 因为匹配了两次 所以function就执行了两次 所以一起变成大写返回了

image-20221018225803470
转义字符补充
匹配值写法
\\\
??
(\(
+\+
-\-
*\*

都需要加转义字符 因为这些符号有特殊含义

练习
字符串去重

方法一

匹配内容分三次选出来 每次都用$1(\w内容) 也就是a和b和c去分别替换匹配出来的内容

<script type="text/javascript">
    var reg = /(\w)\1*/g;  // 反向引用一个或多个
    var str = "aaaabbbbbbbbcccccc";
	console.log(str.replace(reg, "$1")); 
</script>

方法二: 也是返回的$1替换$

<script type="text/javascript">
	var reg = /(\w)\1*/g;
    var str = "aaaabbbbbbbbcccccc";
	console.log(str.replace(reg, function ($,$1) {
        return $1;
    }));  
</script>
image-20221019060521635
把数据转换成科学计数法

10000000000 转换成100.000.000.00

<script type="text/javascript">
	var reg = /\d{1,3}/g;//查1-3位数字以逗号做连接
    var str = "10000000000";
	console.log(str.match(reg).join(",")); 
</script>
image-20221019061715523

Doctype

1.渲染模式

在多年以前(IE6诞生以前),各浏览器都处于各自比较封闭的发展中(基本没有兼容性可谈)。随着WEB的发展,兼容性问题的解决越来越显得迫切,随即,各浏览器厂商发布了按照标准模式(遵循各厂商制定的统一标准)工作的浏览器,比如IE6就是其中之一。但是考虑到以前建设的网站并不支持标准模式,所以各浏览器在加入标准模式的同时也保留了混杂模式(即以前那种未按照统一标准工作的模式,也叫怪异模式)。

三种标准模式的写法

1.<!DOCTYPE html>
2.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
3.<!DOCTYPE html PUBLIC "-//w3C//DTD XHTML 1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好学习_fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值