什么是正则表达式RegExp对象代表一个正则表达式,是对字符串进行模式匹配的利器。为什么使用正则表达式来测试字符串中的模式。例如,可以测试输入字符串以查看字符串中是否出现电话号码模式或信用卡号码模式。这称为数据验证。替换文本。您可以使用正则表达式来识别文档中的特定文本并完全删除该文本或将其替换为其他文本。基于模式匹配从字符串中提取子字符串。您可以在文档或输入字段中查找特定文本。定义正则表达式有两种方式:1.直接量语法/模式/属性2.创建RegExp对象的语法:newRegExp(pattern,attributes);参数:参数pattern为字符串,指定正则表达式的模式;参数attributes为可选参数,包括属性g、i、m,分别用于全局匹配、不区分大小写匹配、多行匹配;返回值:具有指定模式和标志的新RegExp对象;修饰符修饰符告诉g执行全局匹配(查找所有匹配项而不是在找到的第一个匹配项处停止)。i执行不区分大小写的匹配。m执行多行匹配。Brackets方括号包含一系列字符,可以匹配它包含的任何字符;同时可以用^符号定义负数字符类表达式描述[abc]查找方括号内的任意字符[^abc]查找不在方括号内的任意字符[0-9]查找任意数in0-9[a-z]查找从小写a到小写z的任意字符[A-Z]查找从大写a到大写z的任意字符(red|blue|green)查找括号中的任意项,|括号中是元字符或元字符描述的含义。查找除换行符和其他Unicode行终止符之外的任何单个字符\w查找字母数字和下划线,相当于[a-zA-Z0-9_]\W查找字母数字下划线以外的字符,相当于[^a-zA-Z0-9_]\d查找数字字符,相当于[0-9]\D查找非数字字符,相当于[^0-9]\s匹配任意空白字符,包括空格、制表符、换行符等.相当于[\f\n\r\t\v]\S匹配任意一个非空字符,相当于[^\f\n\r\t\v]\b找到一个词边界,即aword空格和空格之间的位置,比如er\b可以匹配never中的er,但是不能匹配verb中的er。er”,但无法匹配“never”中的“er”\0查找空字符("")\n查找换行符\r查找回车符\f查找换页符\t查找atabcharacter\vlookforaverticalTabquantifierQuantifierdescriptionn+匹配任何至少包含一个n的字符串,相当于n{1,}n*匹配零个或多个n的字符串,相当于n{0,}n?匹配零个或1个n的字符串,相当于n{0,1}n{x}匹配一个包含x的序列字符串n{x,y}n,匹配至少x至多y个字符串n{x,}matchesatleastxnstringsn$匹配以n结尾的字符串^n匹配以n开头的字符串正则表达式中的特殊字符需要转义字符正则表达式中的特殊字符有它们的特殊含义,所以当我们要匹配这些特殊字符时字符本身,我们需要对字符进行转义,转义只需要在字符前加上\,这些特殊字符包括$^*+.[?{|()\支持正则表达式的方法RegExp对象方法1.test方法:该方法用于检测一个字符串是否匹配某种模式。语法:RegExpObject.test(str)参数:str为待测试的字符串返回值:如果字符串str中包含匹配RegExpObject的文本,则返回true,否则返回false示例代码如下:varstr="longenandyunxi";console.log(/longen/.test(str));//trueconsole.log(/longlong/.test(str));//false2.exec方法:该方法用于检索字符串公式匹配中的正则表达式。语法:RegExpObject.exec(str)参数:str为待检测的字符串返回值:返回一个数组存放匹配结果,如果没有匹配到则返回null示例代码如下:varstr=“javascripthtmlcss”;console.log(/html/.exec(str));//["html",index:11,input:"javascripthtmlcss"]返回数组中第一个与正则表达式匹配的元素文本,该方法还返回两个属性,index属性声明了第一个的位置匹配文本的字符;input属性存储搜索到的字符串字符串。//如果没有找到,返回nullconsole.log(/node/.exec(str));//支持正则表达式的String对象的null方法1.search方法:该方法用于检索字符串中指定的子串,或者检索与正则表达式匹配的字符串。语法:stringObject.search(regexp)参数:regexp可以是stringObject中检索到的字符串,也可以是要检索的RegExp对象返回值:stringObject中第一个匹配regexp对象的子串的起始位置。如果没有找到匹配的子串,则返回-1;示例代码如下:varstr="helloworld,helloworld";//返回第一个匹配到的位置console.log(str.search(/hello/));//0//search方法不进行全局匹配,忽略标志g,也没有regexp对象的lastIndex属性,总是从字符串开头搜索,总是返回一个匹配的stringObject的第一个位置。console.log(str.search(/hello/g));//0console.log(str.search(/world/));//6//也可以是搜索字符串中的字符console.log(str.search("wo"));//6//如果没有检索到,则返回-1console.log(str.search(/longen/));//-1//我们可以在搜索Write检索时忽略大小varstr2="Hello";console.log(str2.search(/hello/i));//02.match方法:该方法用于检索字符串中的指定值,或者找到一个或多个匹配的正则表达式。此方法类似于indexOf()或lastIndexOf();但它返回指定的值而不是字符串位置。语法:stringObject.match(regexp)参数:regexp可以是stringObject中取出的字符串,也可以是需要取出的RegExp对象返回值:存放匹配成功的数组;如果未找到匹配项,则返回null。示例代码如下:varstr="helloworld";//返回数组中有三个元素,第一个元素存储匹配的文本,有两个对象属性;index属性表示匹配文本起始字符在stringObject中的位置;input属性声明了对stringObject对象的引用;console.log(str.match("你好"));//["hello",index:0,input:"helloworld"]console.log(str.match("Hello"));//nullconsole.log(str.match(/hello/));//["hello",index:0,input:"helloworld"]//全局匹配也是返回一个数组,只是有点不同;它的数组元素存储了stringObject中所有匹配的子串,没有index属性和input属性。varstr2="1加2等于3"console.log(str2.match(/\d+/g));//["1","2","3"]3.replace方法:该方法用于将字符串中的字符替换为其他字符,或者替换与正则表达式匹配的子字符串。语法:stringObject.replace(regexp/substr,replacement);参数:regexp/substr可以是字符串,也可以是需要替换模式的RegExp对象;replacement可以是替换文本或生成替换文本的函数。返回值:返回替换后的新字符串。字符串stringObject的replace()方法执行搜索和替换操作。它将在stringObject中找到与regexp匹配的子字符串,并用replacement替换它们。如果regexp具有全局标志g,则replace()方法将替换所有匹配的子字符串。否则,它只是替换第一个匹配的子字符串。替换可以是字符串或函数。如果它是一个字符串,那么每个匹配项都会被该字符串替换。但是替换中的$字符具有特定含义。如下表所示,它指出模式匹配产生的字符串将用于替换。字符含义$1,$2,...,$99匹配正则表达式中第1到第99个子表达式的文本。$&正则表达式匹配的子字符串。$`是匹配子字符串左侧的文本。$'是匹配子串右侧的文本。$$代表美元符号$。示例代码如下:varstr="helloworld";//用字符串替换字符串vars1=str.replace("hello","a");console.log(s1);//一个世界//使用常规替换字符串vars2=str.replace(/hello/,"b");console.log(s2);//bworld//使用常规的全局替换字符串vars3=str.replace(/l/g,'');console.log(s3);//heoword//$1,$2代表匹配第一个和第二个子表达式的文本//子表达式需要用括号括起来,代表的意思是分组varname="longen,yunxi";vars4=name.replace(/(\w+)\s*,\s*(\w+)/,"$2$1");控制台日志(s4);//"yunxi,longen"console.log('helloworld'.replace(/w/g,'$&'))//helloworldconsole.log('helloworld'.replace(/w/g,'$$'))//hello$orldconsole.log('helloworld'.replace(/w/g,'$`'))//hellohelloorldconsole.log('helloworld'.replace(/w/g,"$'"))//helloorldorld//replace第二个参数也可以是函数function//单词首字母大写varname='aaabbbccc';varuw=name.replace(/\b\w+\b/g,function(word){returnword.substring(0,1).toUpperCase()+word.substring(1);});console.log(uw)//AaaBbbCccvarname2="123cbc45678rtyu909876pjkl54321";name2.replace(/\d+/g,function(v){控制台日志(v);/**第一次打印123*第二次打印45678*第三次打印909876*第四次打印54321*/});/**以下函数有四个回调函数参数*的含义第一个参数是匹配字符串*第二个参数的含义是正则表达式分组的内容。如果没有分组,就没有这个参数。*如果没有这个参数,第四个参数是undefined*第三个参数的意思是匹配项在字符串中的index索引*第四个参数的意思是原字符串*/name2.replace(/(\d+)/g,function(a,b,c,d){console.log(a);console.log(b);console.log(c);console.log(d);/**以上将执行四次,值如下(定期使用括号,表示分组):*第一第一:123,123,0,123cbc45678rtyu909876pjkl54321*909876,15,123cbc45678rtyu909876pjkl54321*第四次:54321,54321,25,123cbc45678rtyu909876pjkl54321*/});4.split方法:该方法将一个字符串拆分为一个字符串数组语法:separyObject.splitator参数:howman.separyObject.splitator[必填],字符串或正则表达式,该参数指定的地方拆分stringObject;2.howmany[optional]该参数指定返回数组的最大长度。如果设置了该参数,则返回的子串不会多于该参数指定的数组。如果未设置此参数,则整个字符串将被拆分,无论其长度如何。返回值:一个字符串数组。该数组在分隔符指定的边界处将字符串stringObject拆分为子字符串。示例代码如下:varstr="Howareyoudoingtoday?"console.log(str.split(""))//["怎么样"、"是"、"你"、"在做什么"、"今天?"]console.log(str.split(""))//["H","o","w","","a","r","e","","y","o","u","","d","o","i","n","g","","t","o","d","a","y","?"]console.log(str.split("",3))//["How","are","you"]//也可以使用正则表达式console.log(str.split(/\s+/))//["How","are","you","doing","today?"]贪心模式和非贪心模式Javascript中的正则表达式贪心模式和非贪心模式模式的区别在于:量词修饰的子表达式的匹配行为;如果整个表达式匹配成功,则贪婪模式尽可能多地匹配;非贪心模式在整个表达式匹配成功的前提下尽可能少的匹配。一些常用的修饰贪心模式的量词有:{x,y},{x,},?,*and+非贪心模式就是在上面的贪心模式后面加一个问号(?),变成一个非贪心模式-贪心模式量词;如下:{x,y}?、{x,}?、??、*?和+?示例代码如下://贪心模式,尽可能多的匹配console.log('0123456789'.replace(/\d{3,6}/,"*"))//*6789//非-贪婪模式,尽可能少的匹配console.log('0123456789'.replace(/\d{3,6}?/,"*"))//*3456789分组和反向引用分组,也称为子表达式。将正则表达式拆分为更小的表达式。直接看代码://没有分组,量词只作用于最后一个字符(c)console.log(/abc{2}/.test('abcabc'));//falseconsole.log(/abc{2}/.test('abcc'));//true//分组,量词作用于整个括号内的子表达式console.log(/(abc){2}/.test('abcabc'));//trueconsole.log(/(abc){2}/.test('abcc'));//false分组经常和反向引用一起使用。反向引用在前面的replace方法中是有的,但是没有提到这个概念,这里先说一下:正则表达式分组的时候,每组自动分配一个组号,从左到右分别是$1$2...另一个例子://Formatdatevarreg=/^(\d{4})[/-](\d{2})[/-](\d{2})$/console.log('2016/11/18'.replace(reg,'$1year$2Month$3day'))//2016年11月18日console.log('2016-11-18'.replace(reg,'$1year$2month$3day'))//2016年11月18日控制台。log('2016-11-18'.replace(reg,'$1$2$3'))//20161118Non-capturinggroups不是所有的组都可以创建反向引用,有一种叫非捕获组,non-capturingGrouping由(?:pattern)表示。当某些组只需要匹配但不需要获取每个组的匹配结果时,使用非捕获分组可以提高匹配速度;非捕获分组的含义可以这样理解:sub-expression表达式可以作为一个整体进行修改,但子表达式匹配结果不会被存储;如下:varreg=/(?:\d{4})-(\d{2})-(\d{2})/vardate='2012-12-21'reg.test(date)RegExp.$1//12RegExp.$2//21这里,(?:d{4})分组不会捕获任何字符串,所以$1是(d{2})捕获的字符串。零宽度断言初学者第一次看到这个名词可能会有点懵(我是第一次看不懂),这里就解释一下吧。零宽断言是得出结论,比如ab,正则:a(?=b),匹配a向右看是b,结果是a,断言不会在匹配内容中,如果是a(?=c),那么什么都匹配不到,因为匹配完a向右看不是c。此外,还有两种类型的零宽度断言:lookahead和lookbehind;但JavaScript只支持前瞻。先行表达式的语法如下:表达式描述m(?=n)匹配紧跟n的字符串mm(?!n)匹配没有紧跟n的字符串m再举两个例子://获取字符串varstr='Ilovedancingbuthelikessinging';varpattern=/\b\w+(?=ing\b)/g;varans=str.match(模式);控制台日志(ans);//["danc","sing"]//获取第五位不是i的单词的前四位vars='我喜欢跳舞但是他喜欢唱歌';varpattern=/\b\w{4}(?!i)/g;varans=s.match(pattern);console.log(ans);//["love","like"]正则表达式的基础差不多就够了,接下来就是感谢大家多用了。共勉!推荐最后推荐两个比较好的工具,可以帮助我们写出更好更准确的正则表达式。正则表达式图形化工具正则表达式检测工具博客地址参考JavaScriptRegExp对象简单Javascript正则表达式学习教程
