JS 学习笔记--7---正则表达式
正则表达式中的内容很多,也很深,下面只是一些基本的知识点,练习中使用的浏览器是IE10,若有不当处请各位朋友指正,我会在第一时间修改错误之处。
匹配的概念:是包含的意思,不是相等的意思
1、正则表达式简介
在表单提交的时候需要用JS来对用户提交的数据进行验证,这样做的目的一是减少网络流量(尽可能的让提交到服务器端的数据时合法的,减少了客户端和服务器端数据交互),二是改善了用户的体验效果。
正则表达式可以在浏览器端进行数据验证的,也可以在服务器端用。当浏览器端数据验证通过以后,将数据提交到服务器端,服务器端还会有数据的验证和有效性处理,由于通过了客户端的验证,故可以节约大量的服务器端的系统资源。
正则表达式(regular expression)是一个描述字符模式的对象,ECMAScript中的RegExp类来表示正则表达式,并且String和RgeExp都顶一个使用正则表达式进行强大的模式匹配和文本检索替换等函数,如果遇到复杂的数据测试就需要用到正则表达式,比如验证URL地址、邮箱是否合法、从大量文本中提取有效信息等。
正则表达式在很多语言中都支持,而且实现方式也大体相同,元字符基本上是一样的,只是有些方法名可能不一样,正真的做到了跨语言的技术。 正则表达式的元字符见百度
2、正则表达式的创建
两种方法:new RegExp('...',[[i][m][g]]);和字面量方式 /.../[[i][m][g]];中括号表示可省
new方法的第一个参数是正则表达式的模式,后面第二个参数是从 igm 三个字母中选择任意字母组成的字符串[ig,im,gm,img 四种之一],称作为模式修饰符,并且模式修饰符的各个字符之间以及两边不能够有其他任何的字符,三个字母的书写顺序无所谓
字面量方式中两个反斜杠之内的值是正则表达式的模式,注意是不带引号的,如果写了引号则代表引号也是模式的组成成员,后面的模式修饰符和上面new方法一样,紧跟第二个反斜杠
|
3、测试正则表达式
RegExp 对象提供了两种测试方法test()和exec()方法,基本功能是相似的,用于测试字符串的匹配。test()方法在字符串中查找是否存在指定的正则表达式并返回布尔值,如果存在就返回true,不存在就返回false;exec()方法也是在字符中查找指定的正则表达式,如果执行成功,则返回包含该查找字符串的相关信息数组(和分组有关),如果执行失败,则返回null。
通过测试得知,test()方法方法是只要匹配一次成功就返回,然后第二次执行的时候从第一次匹配成功的字符串之后开始查找,具体的可以参考练习中RegExp对象属性测试lastIndex
使用方式:pattern.test(str); pattern.exec(str); 返回值可以用于if的条件
4、使用字符串的正则表达式方法
除了上面的test()和exec()方法外,还有几个比较常用的String对象提供的几个方法 注:这些方法都是操作的值,不会改变字符串的本身,因为字符串具有不可变性,如果正则表达式中没有注明进行全局匹配的话,都默认只是匹配一个就返回,但是search永远是匹配第一个就返回
|
5、RegExp 对象中的静态属性
RegExp提供了一些静态属性,不需要声明对象就可以运行,但是不是所有浏览器都兼容
|
在使用这些静态属性之前必须要先执行一次正则表达式【pattern.test(str)/pattern.exec(str)都可以,但是这两个执行都只是匹配一次就返回,所以可能有的效果不明显,可以多执行几次】,只有执行一次后使用这些静态属性才有结果,alert(RegExp.input)即可
使用短名和前面属性是一样的效果,短名使用是通过 RegExp['$_']等来操作,同时input这个静态属性比较特殊,可以通过RegExp.$_ 来使用,其它的短名均不可以这样使用。
var pattern=/google/ig;
var str="This Google is google ? Yes !";
alert(RegExp.input); //输出为空
pattern.test(str); //执行以下正则表达式 //其实这个测试是只要匹配一个就返回
alert(RegExp.input); //This Google is google ? Yes !
alert(RegExp['$_']); //This Google is google ? Yes !
alert(RegExp.$_); //This Google is google ? Yes !
6、RegExp中的对象属性
RegExp提供了一些对象的实例属性,这是针对具体的正则表达式的属性,使用的很少
|
注:lastIndex 在获取下次匹配位置上IE和其他的浏览器有偏差,主要表现在非全局匹配上,lastIndex 还支持手动赋值。
var pattern =/Box/ig;
alert(pattern.global); // true 是否设置为全局匹配 表示 g 是否已经设置
alert(pattern.ignoreCase); // true 是否设置为忽略大小写 表示 i 是否已经设置
alert(pattern.multiline); // false 是否设置为多行匹配 表示 m 是否已经设置
alert(pattern.source); // Box 返回的是正则表达式的源字符串形式 var str = "box and Box and box";
//exec()一次只是匹配一条数据就返回
pattern.exec(str);
alert(pattern.lastIndex); //3 上一条语句执行后匹配了一个box从这后面开始的第一个字符串,下标为3
pattern.exec(str); //再执行一次 匹配第二个box 后面的字符的索引为11
alert(pattern.lastIndex); //11
pattern.lastIndex=13; //设置下一次开始匹配的起始位置
alert(pattern.lastIndex); //13
获取控件 一般简单的元字符的意思就不说明了 百度一大把
7、\b代表的是是否到达字符串的边界,和开始结尾标记符 ^,$ 有同样的含义;
| 或匹配符,带有分组的意思,分隔供选择的字符.这个模式符使用的时候要注意它两边的内容是二选一,有时要注意用括号将其括起来;例如: /ab|cd|ef/ 匹配的是字符串 "ab",或者是字符串 "cd",又或者 "ef".
{4,8}等这种用大括号阔气来的代表的是在这个大括号前面的分组或者某个字符匹配的次数
8、在模式中,用括号括起来的代表一个分组,分组的匹配模式是从外到里,从左到右进行匹配的。在模式中进行了分组,然后执行了一次正则表达式,就可以在后面使用匹配组里面的内容,用RegExp.$1可以直接输出第一个分组的内容,或者在字符串的替换方法str.replace()中可以直接用$1,$2等来表示分组对应的匹配子字符串,如str.replace(pattern,'A$1A'),就是直接在复合第一个分组的内容两边加上字母A;当多个分组的时候是从左到右依次用$1,$2,$3等来代表分组匹配的内容。
9、贪婪模式和非贪婪模式
贪婪模式:在保证整个模式匹配能够成功的情况下,有些表达式会尽可能多的匹配一些字符。
非贪婪模式:同样是在保证整个模式匹配成功的情况下,尽可能的少匹配字符。
|
有时如果要解决贪婪的问题,可能要开启全局匹配。
9、使用exec()方法,返回数组
上文中提到此方法是RegExp中提供的可以用来测试正则表达式的方法,如果成功会返回一个数组,而这个方法其实主要是针对在表达式中有分组的时候使用的。
这个方法返回的结果中,下标为0的元素就是匹配成功的整体字符串,从下标为1开始一直到后面,里面的内容是对应的每一个分组匹配的内容,也就是说下表为1的元素是模式中第一个分组匹配的结果,以此类推。第i个分组就对应的返回数组中下标为i的元素。
如果没有分组的时候返回的是整个匹配的字符串,也就是下标为0的字符串
10、捕获性分组和非捕获性分组
所谓的捕获性,我理解为就是需要返回分组所匹配的结果;
而非捕获性则是不需要返回匹配的结果,有的时候却又必须要用一个分组来表示,比如在一个字符串的某一个部分可以有几组值,会需要用或匹配符来分割,而或匹配符如果不括起来会把它左边及右边当成两个组,而不是我们希望的只是某一部分相或,那就必须要用括号把个或分组符所分割的所有内容给括到一个括号内,但是由于不需要返回这个值,故可以用一个非捕获性分组。
一般的分组都是捕获性分组,非捕获性分组就是在前括号后面添加一个 ?: 就OK var pattern=/(\d+)(?:[a-z]+)/;执行后第二个分组内容不会返回
11、分组嵌套 :在一层分组中再添加一层分组,括号的嵌套 p=/(b(a(c)))/
分组嵌套中返回的时候也是先返回整个匹配的字符串,然后返回最外层的匹配结果,然后第二层的匹配结果,依次类推,先外后里
分析的时候可以先将分析的本层分组里面的所有分组视为无,也就是分析外层的时候就去掉本层里面所有嵌套的括号。 比如上面的模式 p.exec("bac");//返回的数组结果为:bac,bac,ac,c
12、前瞻匹配
就是在模式的匹配时候,某些字符后面必须更上一些特定的内容才能够匹配成功,比如字符串 "google" 中规定模式 goo 后面必须是 gle 才能够匹配成功,否则不匹配成功,就用到前瞻匹配
用括号将gle括起来放在goo后面,并且前括号后面写上 ?= 就OK 如:/goo(?=gle)/ 这样匹配的结果就只能够是字符串 google
13、特殊字符的处理
在特殊字符(比如:. ? \ [ ] * + 等)前面添加一个转义字符 \,使这些特殊字符失去特殊意义
14、换行匹配 主要是读取文本的时候,存在多行
模式一般都是针对一行,除非明确的在模式中添加了换行符,才会跨行匹配 如果要处理多行的数据,则需要开启多行模式并且还要开启全局匹配模式,否则只是匹配一次就会返回
15、常用的一些正则表达式 许多常用的正则表达式,百度一下,
练习代码:
/* 表达式的创建 // new RegExp() 方式创建
var pattern = new RegExp('Reg');//创建一个模式,括号中的字符串就是模式字符串,它是将要检测数据的规范
alert(pattern); //输出结果是:/Reg/ 两个反斜杠就是字面量创建形式,中间是表达式 //第二个可选参数为模式可选符,总共三个字符 i,g,m 顺序无所谓,不带有任何分隔符
//模式可选字符代表的意义:i:忽略大小写,g:全文匹配,m:多行匹配(不写的话是只匹配第一行)
var pattern = new RegExp('Reg',"igm");
alert(pattern); // /Reg/gim //可选修饰符无论怎么写都是按照 gim 的顺序输出的
//var pattern = new RegExp('Reg',"i,gm"); //error,这个参数只能是由 gim 组成的无序字符串
var pattern = new RegExp('Reg',"mig");
alert(pattern); // /Reg/gim //字面量创建方式 用两个反斜杠括起来,中间就写要匹配的表达式模式,第二个反斜杠后面跟上模式可选字符,同样不能用其他字符
var pattern = /Reg/; //创建一个模式字符串,注两个反斜杠中没有引号
alert(pattern); // /Reg/
pattern=/Reg/im;
alert(pattern); // /Reg/im
pattern = /"Reg"/gim;
alert(pattern); // /"Reg"/gim //测试正则表达式 将需要检测的字符串用正则表达式进行收索匹配,看字符串中是否包含复合表达式规则的结果,
// pattern.test(string);//test方法是测试字符串string中是否包含符合表达式的值,包含就返回true,否则返回false
var pattern = new RegExp('Reg');
var str='regexp';
alert(pattern.test(str));//false //因为表达式中是大写的 'Reg' var pattern =new RegExp("Reg",'i');// i 表示忽略大小写
var str="regexp";
alert(pattern.test(str));//true 因为表达式中的模式选择符说明了忽略大小写,字符串中包含小写的 'reg',故匹配成功 var pattern=new RegExp("Reg",'i');
var str="this is regexp!";
alert(pattern.test(str));//true var pattern=/Reg/i; //使用字面量创建表达式,设置模式为忽略大小写
var str="This Is REGEXP !";
alert(pattern.test(str)); //使用字面量的方式一句话简化创建测试正则表达式 不推荐,容易误读,含义表达不清晰
alert(/Reg/i.test("this is rgeohi "));//false
alert(/Reg/i.test("this is regexp "));//true // pattern.exec() 方法 匹配成功后返回的是一个数组,匹配不成功返回的是null
var pattern=/Reg/i; //忽略大小写
var str='abcdreghigkReghh';//这里面包含两个 reg 子字符串
alert(pattern.exec(str));//reg
alert(typeof pattern.exec(str)); //object 数组的类型是object类型
str='abcdegr';
alert(pattern.exec(str)); //null
alert(typeof pattern.exec(str)); // object Null类型的字符串返回值为object
var a=null;
alert(typeof a);//object */ /* 使用字符串的正则表达式方法 这些方法是String类型提供的,故使用方式上稍稍和上面两个方法不同 //str.match(pattern);方法是字符串提供的匹配模式,然后以数组的形式返回匹配的所有结果(子字符串或者null)
var pattern=/Box/ig; //全局的忽略大小写的
var str="this is a box,that is a Box??";
alert(typeof str.match(pattern));// object 说明是数组
alert(str.match(pattern));//box,Box
pattern=/Box/i; //忽略大小写 非全局的
alert(str.match(pattern));//box
pattern=/Box/g; //全局的 区别大小写的
alert(str.match(pattern));//Box //str.search(pattern); 返回的是字符串中匹配到的模式的子字符串的起始位置(下标为0开始的索引)
//search方法是查找及返回 无需要全局
var pattern=/Box/ig;
var str="this is a box!This is a Box!!";
alert(typeof str.search(pattern)); //number
alert(str.search(pattern)); //10
pattern=/Box/i; //不全局匹配,忽略大小写
alert(str.search(pattern)); //10
pattern=/Box/g; //区分大小写,匹配全局
alert(str.search(pattern)); //24
//没有查找到返回-1
var pattern=/Bbx/ig;
var str="this is a box!This is a Box!!";
alert(typeof str.search(pattern)); //number
alert(str.search(pattern)); //-1 没有查到 //str.replace(patter,replacement);将字符串按照pattern模式进行匹配,然后将匹配到的子字符串替换成replacement子字符串
//replace方法不会改变原来的原来的字符串的值
var pattern =/Box/ig;
var str ="this is box,that is a Box;;";
alert(typeof str.replace(pattern,'XBox'));//string
alert(str); //"this is Box,that is a box;;"
alert(str.replace(pattern,'XBox')); //"this is XBox,that is a XBox;;"
pattern=/Box/i;//不全局匹配,忽略大小写
alert(str.replace(pattern,'XBox')); //"this is XBox,that is a Box;;"
pattern=/Box/g; //区分大小写,匹配全局
alert(str.replace(pattern,'XBox')); //"this is box,that is a XBox;;" //str.split(pattern);方法是将字符串按照pattern模式进行匹配然后按照匹配的子
//字符串为分隔符对源字符串进行分割,返回分割后的数组,元字符穿不会改变
var pattern =/Box/ig;
var str ="this is box!!that is a Box!!";
alert(typeof str.split(pattern));//object
alert(str.split(pattern)); //"this is ,!!that is a Box,!!";
alert(str); //"this is box!!that is a Box!!"
alert(str.split(pattern).length);//3 分割成3块 */ /* RegExp 对象的一些静态属性和实例属性
//静态属性是可以不实例化的属性,但是在这之前需要执行以下正则表达式,
//用短名操作的时候是写在中括号中用引号括气来的
//Opera浏览器只是支持 leftContext和rightContext IE不支持multiline
var pattern=/google/ig;
var str="This Google is google ? Yes !";
alert(RegExp.input); //输出为空
pattern.test(str); //执行以下正则表达式 //其实这个测试是只要匹配一个就返回
//RegExp.input 返回的是当前被匹配的源字符串 $_ 是input的短名,效果是一样的
alert(RegExp.input); //This Google is google ? Yes !
//用短名操作只是 input才可以用点的形式
alert(RegExp['$_']); //This Google is google ? Yes !
alert(RegExp.$_); //This Google is google ? Yes !
//RegExp.lastMatch 返回的是最后被匹配到的字符串
alert(RegExp.lastMatch); //Google
alert(RegExp['$&']);
//返回最后一次匹配之前和之后的内容
alert(RegExp.leftContext); //This 后面还有一个空格
alert(RegExp['$`']);
alert(RegExp.rightContext); // is google ? Yes !;
alert(RegExp['$\'']);
//用于指定是否所有的表达式都用于多行的布尔值
alert(RegExp.multiline); //undefined IE不支持 在火狐中返回的时候false
alert(RegExp['$*']);
pattern=/(g)oogle/ig;
pattern.test(str);
//最后一对圆括号内匹配的字符串
alert(RegExp.lastParen); //G
alert(RegExp['$+']); //下面是对象的实例属性 基本上没有用
var pattern =/Box/ig;
alert(pattern.global); // true 是否设置为全局匹配 表示 g 是否已经设置
alert(pattern.ignoreCase); // true 是否设置为忽略大小写 表示 i 是否已经设置
alert(pattern.multiline); // false 是否设置为多行匹配 表示 m 是否已经设置
alert(pattern.source); // Box 返回的是正则表达式的源字符串形式 //lastIndex在获取下一次匹配位置上IE和其他浏览器有偏差,主要表现在全局匹配上面
var pattern =/Box/ig;
var str = "box and Box and box";
//test一次只是匹配一条数据就返回
pattern.test(str);
alert(pattern.lastIndex); //3 上一条语句执行后匹配了一个box从这后面开始的第一个字符串,下标为3
pattern.test(str); //在执行一次 匹配第二个box 后面的字符的索引为11
alert(pattern.lastIndex); //11
pattern.lastIndex=13; //设置下一次开始匹配的起始位置
alert(pattern.lastIndex); //13 var pattern =/Box/ig;
var str = "box and Box and box";
//exec()一次只是匹配一条数据就返回
pattern.exec(str);
alert(pattern.lastIndex); //3 上一条语句执行后匹配了一个box从这后面开始的第一个字符串,下标为3
pattern.exec(str); //再执行一次 匹配第二个box 后面的字符的索引为11
alert(pattern.lastIndex); //11
pattern.lastIndex=13; //设置下一次开始匹配的起始位置
alert(pattern.lastIndex); //13 */ /* 提取字符 简单的元字符匹配就省略了 主要是针对分组 var pattern=/goo gle/; //直接用空格去匹配字符中的空格
var str='goo gle';
alert(pattern.test(str));//true var pattern=/goo\sgle/; //用\s来匹配空格、制表符等
var str='goo gle';
alert(pattern.test(str));//true // \b 表示到达边界
var pattern=/google\b/; //\b表示到达边界 和开始结束符 ^、$功能类似
var str='googleg';
alert(pattern.test(str)); //false
str='google';
alert(pattern.test(str)); //true
pattern=/\bgoogle/;
alert(pattern.test(str)); //true
alert(pattern.test('ggoogle'));//false // | 或匹配选择模式符
var pattern=/google|baidu|bing/; // | 表示或匹配选择模式 是一个分组符
var str="this is baidu"; //匹配概念:是包含的意思 而不是相等的意思
alert(pattern.test(str)); //true
alert(pattern.test('soso'));//false //{4,8}表示的是前面这个字符或者说是分组分组匹配的次数
var pattern=/google{4,8}/; //表示匹配e的4到8次
var str='googleeeeee';
alert(pattern.test(str)); //true var patter=/(google){4,8}/; // google 使用括号括起来的,是一个分组,可以看成一个字符
var str='googlegooglegooglegoogle'; //表示 google 4-8次
alert(pattern.test(str));//true var pattern=/8.*8/;
var str='this is a 8google8';
alert(pattern.test(str)); // true // 一个括号代表一个分组,组可以用 $1,$2等来代替,编号是从1开始,而不是0开始
//当执行正则表达式后,$1 就代表的是第一个分组匹配的内容
var pattern=/8(.*)8/;
var str='this is a 8google8';
alert(pattern.test(str)); // true
alert(RegExp.$1); //google RegExp.$1表示获取模式中第一个分组对应的匹配字符串
document.write(str.replace(pattern,'<strong>$1</strong>')); //通过分组进行交换内容
var pattern=/(.*)\s(.*)/; //两个分组
var str='google baidu';
alert(pattern.test(str)); //true
alert(str.replace(pattern,'$2 $1'));//交换位置 baidu google */ /*
在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,
比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复
匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",
就是贪婪模式
*/ /* 贪婪非贪婪模式(惰性模式) 贪婪:尽可能的多匹配一点 非贪婪:少匹配一点,让后面的尽快匹配
//对于贪婪模式解决的时候再后面添加一个 ? 就变成了非贪婪的模式了
var pattern=/[a-z]+/; // + 就是一个贪婪模式
var str='abcd';
alert(str.replace(pattern,1));//1 贪婪下将所有的字符都给匹配上了,然后视为一个分组 var pattern=/[a-z]+?/; // +? 非贪婪模式
var str='abcd';
alert(str.replace(pattern,1));//1bcd 非贪婪模式,只是匹配了第一个字符 var pattern=/[a-z]+?/g; // +? 非贪婪模式 但是开启了全局
var str='abcd';
alert(str.replace(pattern,1));//1111 //贪婪模式下的结果
var pattern=/8(.*)8/;
var str= '8google8 8google8 8google8'; //匹配到了google8 8google8 8google
alert(str.replace(pattern,'<strong>$1</strong>'));
//结果是:<strong>google8 8google8 8google</strong>
//因为在匹配的过程中, . 元字符又可以表示任意的字符,而 * 又是一个贪婪模式匹配 //使用惰性模式 为开启全局
var pattern=/8(.*?)8/;
var str= '8google8 8google8 8google8';
alert(str.replace(pattern,'<strong>$1</strong>'));//<strong>google</strong> 8google8 8google
document.write(str.replace(pattern,'<strong>$1</strong>'));
//尽可能的让后面的匹配 故这次只是匹配了一个 8google8 //使用惰性模式 开启了全局后 正确
var pattern=/8(.*?)8/g; //开启全局
var str= '8google8 8google8 8google8';
alert(str.replace(pattern,'<strong>$1</strong>'));
document.write(str.replace(pattern,'<strong>$1</strong>'));
//<strong>google</strong> <strong>google</strong> <strong>google</strong> //另外一种惰性 屏蔽了8的匹配,也就是两边包含字符
var pattern=/8([^8]*)8/g; //开启全局
var str= '8google8 8google8 8google8';
alert(str.replace(pattern,'<strong>$1</strong>'));
document.write(str.replace(pattern,'<strong>$1</strong>'));
//<strong>google</strong> <strong>google</strong> <strong>google</strong> //{m,n}{n}{n,}也是贪婪模式
var pattern=/[a-z]{2,5}/;//{2,5}也是贪婪模式 会尽可能的匹配到5个字符
var str='abcdefg';
alert(str.replace(pattern,'1')); //1fg var pattern=/[a-z]{3}/;//{3}也是贪婪模式 会尽可能的匹配到5个字符
var str='abcdefg';
alert(str.replace(pattern,'1')); //1defg var pattern=/[a-z]{3}/g;//{3}也是贪婪模式 会尽可能的匹配到5个字符
var str='abcdefg';
alert(str.replace(pattern,'1')); //11g var pattern=/[a-b]?/;//{2,5}也是贪婪模式 会尽可能的匹配到5个字符
var str='abcdefg';
alert(str.replace(pattern,'1')); //1fg
*/ /* 用 exec() 返回数组
//如果没有分组的时候返回的是整个匹配的字符串 其实就是返回的数组第1个元素
var pattern=/^[a-z]+\s[0-9]{4}$/;
var str='google 2014';
alert(pattern.exec(str));//gogle 2014
alert(pattern.exec(str)[0]);//gogle 2014 var pattern=/[a-z]+/i;
var str='123abcdefg234';
alert(pattern.exec(str));//abcdefg
alert(pattern.exec(str)[0]);//abcdefg //返回的数组中 res[0]是匹配的整个字符串内容,res[1]开始一直往后是按照分组顺序来返回的
var pattern=/^([a-z]+)\s([0-9]{3,})([A-Z]+)$/;
var str='abcd 12345EFJH';
var res=pattern.exec(str)//
alert(res);//abcd 12345EFJH,abcd,12345,EFJH
alert(res.length);//4
alert(res[0]); //abcd 12345EFJH 匹配的字符串
alert(res[1]); //abcd 第一个分组
alert(res[2]); //12345 第二个分组
alert(res[3]); //EFJH 第三个分组 */ /* 捕获性分组和非捕获性分组 分组后需要返回匹配的分组信息,称为捕获分组,非捕获就是不需要返回,效率较高
var pattern=/(\d+)([a-z]+)/; //返回所有的分组信息 为捕获性分组
var str='1234ahcd';
alert(pattern.exec(str));//1234ahcd,1234,ahcd
alert(pattern.exec(str).length);//3 var pattern=/(\d+)(?:[a-z]+)/; //不需要返回的分组中前面加一个 ?: 就是非捕获性分组
var str='1234ahcd';
alert(pattern.exec(str));//1234ahcd,1234
alert(pattern.exec(str).length);//2 */ /* 分组嵌套 外层分组中在添加两层分组,捕获的时候先外后里
//分析的时候从外向里分许,分析外层分组的时候,可以把里层分组的括号先去掉
var pattern=/(A+(B+(C+)))/;
var str='AABBCC';
alert(pattern.exec(str)); //AABBCC,AABBCC,BBCC,CC
alert(pattern.exec(str).length);//4
var res=pattern.exec(str);
alert(res[0]); //AABBCC 匹配的字符串
alert(res[1]); //AABBCC 返回的是匹配的第1个分组,从上面字符串来看就是外层分组,相当于是把里面两层分组给去掉的结果
alert(res[2]); //BBCC 返回的是匹配的第二个分组,从上面字符串来看是第二层分组,相当于把最里面的一层分组给去掉的结果
alert(res[3]); //CC 返回的是匹配的第三个分组,从上面字符串来看是最里面的一个分组 */ /* 使用前瞻匹配 就是模式的某些字符后面必须更上一些特定的内容才能够匹配 var pattern=/goo/; //非前瞻性匹配的正则表达式,只要包含goo都能够匹配
var str='this google';
alert(pattern.test(str)); //true
alert(pattern.exec(str)); //goo
str='this goo123';
alert(pattern.test(str)); //true
alert(pattern.exec(str)); //goo pattern=/goo(?=gle)/; //前瞻性匹配的正则表达式,goo后面必须是gle
var str='this google';
alert(pattern.test(str)); //true
alert(pattern.exec(str)); //goo
str='this goo123';
alert(pattern.test(str)); //false
alert(pattern.exec(str)); //null var pattern=/^[a-z]{3}([0-9]{4})/;
var str='cbadefg12345';
alert(pattern.test(str));//false str='abc1234';
alert(pattern.test(str));//true
alert(pattern.exec(str));//abc1234,1234
pattern=/^[a-z]{3}(?=0)([0-9]{2,})/; //前瞻性匹配 要求在字符后面必须跟上一个0然后在是三个数值
alert(pattern.test(str));//false
alert(pattern.exec(str)); */
/* 特殊字符 需要使用转义字符 \ var pattern=/\.\[\/b\]/;//通过转义字符是 .、[、]不再是特殊的字符,而是匹配的字符串中包含的字符
var str='.[/b]';
alert(pattern.test(str));//true
alert(pattern.exec(str));//.[/b]
str='h8b8';
alert(pattern.test(str));//false */ /* 使用换行匹配 主要是在读取文本的 时候 需要开启多行以及全局匹配才行 var pattern=/^(\d)+/; //用一个数子开头
str='1.baidu\n2.google\n3.bing';
alert(pattern.test(str));
alert(str.replace(pattern,'#'));
patter=/^(\d)+/g;
alert(str.replace(pattern,'#'));
pattern=/^(\d)+/m;
alert(str.replace(pattern,'#'));
//上面的结果都是一下 只是替换了首行
//#.baidu
//2.google
//3.bing
pattern=/^(\d)+/gm;
alert(str.replace(pattern,'#'));
//开启了全局和多行后替换了全部的数子
//#.baidu
//#.bing */
JS 学习笔记--7---正则表达式的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
- WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- 2019-4-29 js学习笔记
js学习笔记一:js数据类型 1:基本数据类型 number类型(整数,小数) String类型 boolean类型 NaN类型其实是一个nu ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- JS学习笔记5_DOM
1.DOM节点的常用属性(所有节点都支持) nodeType:元素1,属性2,文本3 nodeName:元素标签名的大写形式 nodeValue:元素节点为null,文本节点为文本内容,属性节点为属性 ...
随机推荐
- C#读取xlsx文件Excel2007
读取Excel 2007的xlsx文件和读取老的.xls文件是一样的,都是用Oledb读取,仅仅连接字符串不同而已. 具体代码实例: public static DataTable GetExcelT ...
- Hadoop在win7下部署的问题
问题: 为了测试方便所以在win7下部署了伪分布式hadoop运行环境,但是部署结束后在命令行运行hadoop命令创建一个用户文件目录时出现了一下情况: 系统找不到指定的批标签- make_comma ...
- ASP.NET MVC5学习笔记之Action参数模型绑定之模型元数据和元数据提供
一. 元数据描述类型ModelMetadata 模型元数据是对Model的描述信息,在ASP.NET MVC框架中有非常重要的作用,在模型绑定,模型验证,模型呈现等许多地方都有它的身影.描述Model ...
- 【推介】GitHub
隆重推介:GitHub(https://github.com/) 作为开源代码库以及版本控制系统,Github拥有140多万开发者用户. 随着越来越多的应用程序转移到了云上,Github已经成为了管理 ...
- delphi 资源文件详解
delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...
- Python基础 第一天
编码 #coding=utf-8 函数入口 if __name__== "__main__": 内置方法 type:a=1 type(a) help:import time hel ...
- Python学习教程(learning Python)--3.3.2 Python的关系运算
如果if的condition不用布尔表达式来做条件判断而采用关系表达式,实际上关系表达式运算的结果要么是True要么是False.下面我们先了解一些有关关系运算符的基础知识,如下表所示. 做个小程序测 ...
- 安装SQL Server Management Studio遇到的29506错误
首先要在IIS里把internet 信息哪项选上.然后在安装SQL Server, 在安装的时候一直报 29506错误,装了几次,不知道什么原因.谷歌了一下说是权限的问题. 很纳闷,我当然用的是管理员 ...
- C语言中进制知识总结
1.什么是进制 进制是一种计数的方式,常用的有二进制.八进制.十进制.十六进制.任何数据在计算机内存中都是以二进制的形式存放的. 我对进制的个人理解,二进制数是以2为计算单元,满2进1位的数:八进制数 ...
- Linux软链接与硬链接
1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点 ...