正则表达式基础No.1正则表达式简介(RegularExpression)1、正则表达式是具有特殊语法的字符串,用来表示指定字符或者字符串在另一个字符串中出现的情况。2、这些模式字符串,有的十分简单,有的十分复杂,它们可以实现很多功能,从删除字符串中的空格到验证信用卡号的有效性等等3、正则表达式是一个描述字符模式的对象4、正则表达式基于RegExp对象实现RegExp对象语法:newRegExp(pattern,attributes)1、pattern:是一个字符串,指定了正则表达式的模式2、attributes:修饰符,用以说明高级匹配模式的规则(可选参数,并且可以组合使用)3、g执行一个全局匹配,简而言之,即找到所有的匹配,而不是在找到第一个之后就停止4、i执行不区分大小写的匹配demo1:varstr='welcome';varre=newRegExp('a','i');//只会匹配字符串中出现的第一个字母a(不区分大小写)alert(re.test(str));RegExp对象demo2:varre=newRegExp();//RegExp是一个对象,和Array一样re=newRegExp(a);//只会匹配字符串中出现的第一个小写字母are=newRegExp(a,g);//匹配字符串中出现的所有小写字母are=newRegExp(a,i);//只会匹配字符串中出现的第一个大写A或者小写are=newRegExp(a,ig);//只匹配字符串中出现的所有大写A或者小写a字面量写法语法:/text/pattern参数:参考创建RegExp对象里面的参数demo:varre;re=/a/;//只会匹配字符串中出现的第一个小写字母are=/a/g;//匹配字符串中出现的所有小写字母are=/a/i;//只会匹配字符串中出现的第一个大写A或者小写are=/a/ig;//只匹配字符串中出现的所有大写A或者小写a语法与释义:正则表达式:由元字符、字符类和量词组成基础语法“^([]{})([]{})([]{})$”正则字符串=“开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束”demo:patt=/^a*[123]{2,6}2$/;元字符1、正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。(demo:patt=/^a*[123]{2,6}2$/;)2、元字符使正则表达式具有处理能力。3、所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。4、任何时候要在正则表达式中匹配元字符,都必须对它们进行转义。因此我们要匹配一个问号,正则表达式应该这样表示元字符//method1:varreQMark=/\?/;//method2:因为这种情况下Javascript解析器会按照解析特殊字符串(比如:\n)的方式翻译\?。为了不会出现这个问题,我们用两个反斜杠(双重转义)varreQMark=newRegExp(\\?);常用元字符(\w不包括汉字\W包含汉字)varstr=ck?dfckj.abk-dj;pa=/(\b\w+\b)/g;console.log(str.match(pa));实例字符串;tel:086-0666-88810009999原始正则:^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$速记理解:开始tel:普通文本[0-9数字]{1至3位}-普通文本[0数字][0-9数字]{2至3位}-普通文本[0-9数字]{8至11位}结束等价简写后正则写法:^tel:\d{1,3}-[0]\d{2,3}-\d{8,11}$,进阶No.2贪婪的、惰性的量词贪婪先看整个字符串是不是一个匹配,如果没匹配去掉最后一个字符,再次尝试,直到发现一个匹配或者字符串不剩任何字符惰性量词(?)的话,先看字符串第一个字母是不是匹配,如果不匹配,再读入下一个字符,组成两个字符组成的字符串,然后再看这个字符串匹配不,直到发现一个匹配或者整个字符串都检查过也没有匹配注意:贪婪的、惰性的量词跟在普通量词后面'123456789'.match(/\d{3,5}/g);//[12345,6789]'123456789'.match(/\d{3,5}?/g);//[123,456,789]//看了上面介绍的量词,也许爱思考的同学会想到关于匹配原则的一些问题,比如{3,5}这个量词,要是在句子中出现了十次,那么他是每次匹配三个还是五个,反正3、4、5都满足3~5的条件,量词在默认下是尽可能多的匹配的,也就是大家常说的贪婪模式//既然有贪婪模式,那么肯定会有非贪婪模式,让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试,做法很简单,**在量词后加上?即可**反向引用(捕获性分组)我们该怎么利用分组呢?每个分组都被存放在一个特殊的地方以备将来使用。这些存储在分组中的特殊值,称之为反向引用(backreference)反向引用是按照从左到右遇到的左括号字符的顺序进行创建和编号的反向引用(捕获性分组)varsToMatch=#123456789;varreNumber=/#(\d+)/;reNumber.test(sToMatch);alert(RegExp.$1);//outputs123456789varsToChange=12345678;varreMatch=/(\d{4})(\d{4})/;varsNew=sToChange.replace(reMatch,$2$1);alert(sNew);//outputs56781234候选有时候要创建一个能够正确匹配想得到所有可能性的模式是十分困难的举个栗子:如果我们要对同一个表达式同时匹配red和black时需要怎么做呢?方法1:这些单词完全没有相同的字符,这样就要写两个不同的正则表达式,并分别对两个字符串进行匹配varsToMatch=ablackbred;varregRed=/red/;varregBlack=/black/;alert(regRed.test(sToMatch));alert(regBlack.test(sToMatch));候选方法2:候选方式(推荐)varsToMatch=ablackbred;varregRedBlack=/red|black/;alert(regRedBlack.test(sToMatch));前瞻*使用前瞻可以让特定的字符分组出现在另外一个字符串之前,才去捕获它。名称表达式含义正向前瞻exp1(?=exp2)匹配后面是exp2的exp1负向前瞻exp1(?!exp2)匹配后面不是exp2的exp1varsToMatch1=bedroom;varsToMatch2=bedding;varreBed=/(bed(?=room))/;varreBed2=/(bed(?!room))/;console.log(reBed.test(sToMatch1));console.log(reBed2.test(sToMatch1));console.log(reBed.test(sToMatch2));console.log(reBed2.test(sToMatch2));正则表达式对象的方法(重点)方法描述exec检索字符串中指定的值。返回找到的值,并确定其位置。test检索字符串中是否有指定的值。返回true或false。(用的最多)varstr1=34uw9uwd;varpatt=/uw/g;//”g”:全局匹配vart=patt.exec(str1);alert(t);//与正则匹配文本,没找到返回nullalert(patt.lastIndex);//下一次开始查找的位置t=patt.exec(str1);alert(t);alert(patt.lastIndex);支持正则表达式的String对象的方法(String对象的一些方法支持正则表达式作为参数传入)方法描述search检索与正则表达式相匹配的值,返回找到的位置。只检索第一个,会忽略修饰符gmatch找到一个或多个正则表达式的匹配(用的最多)replace替换与正则表达式匹配的子串(用的最多)varstr=ck?dfckj.abk-dj;pa=/(\b\w+\b)/g;console.log(str.match(pa));感谢您的聆听!