JavaScript之正则表达式
正则表达式是构成搜索模式的字符序列。该搜索模式可用于文本搜索和文本替换操作。简单来说,正则表达式其实是一种规则,主要应用在检测字符串是否符合我们定义的规则上。
一 创建正则表达式
创建正则表达式有两种方式,他们都返回一个正则表达式对象(regexpobject):
1, 字面量方式
1 var reg = /pattern/modifiers;
2, 构造函数方式
1 var reg = new regexp(pattern,modifiers);
pattern 是一个字符串,指定了正则表达式的模式,他也可以是一个其他的正则表达式。
modifiers 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、不区分大小写的匹配和多行匹配。
注意,如果不指定全局查找,即模式g,那么该正则表达式执行过程会在匹配到第一个符合模式要求的字符串时即停止。
二 元字符
元字符是拥有特殊含义的字符,每个元字符本身就可以作为一个正则表达式存在,用来匹配一个字符。
1,\d 匹配0-9的任何数字
2,\d 匹配任何非数字字符
3,\w 匹配任何单词字符,a-z,a-z,0-9和下划线_
4,\w 匹配任何非单词字符
5,\s 匹配空白字符,例如空格,换行。制表符等
6,\s 匹配任何非空字符
7,.(点) 匹配除了换行和行结束符外的任何字符
8,\b 匹配单词边界
9,\b 匹配非单词边界
三 范围查找
很多时候我们并不只是想匹配一个确定的字符,而是希望匹配在一个范围内的字符,这时就需要用到正则表达式中的范围查找了,范围查找使用方括号[]。
1,[abc] 匹配在方括号内出现的字符
2,[^abc] 匹配在方括号内没有出现的字符
4,[0-9] 匹配0到9的任何数字,等同于\d
5,[a-z] 匹配a到z之间的任何字符
5,一个特殊的:
(a-z|0-9) 匹配a-z的字符或者0-9的数字
请注意,上面所提到的元字符和范围查找实际都只匹配单个字符。若果要匹配多个字符怎么办呢?这就需要下面讲到的量词了。
四 量词
1,x+ 匹配1个或多个x
2,x* 匹配0个或多个x
3,x? 匹配0个或1个x
4,x{n} 匹配n个x
5,x{m,n} 匹配m到n之间的数字个x(包含m个和n个)
6,x{m,} 匹配至少m个x
7,x$ 匹配以x结尾
8,^x 匹配以x开头
五 方法
正则表达式有两个常用的方法:
1,test()
检查指定字符串是否符合正则表达式的匹配规则,返回true或者false。
下面是一个验证座机号码的测试:
1 var reg = /0\d{2,3}-\d{7,8}/g; 2 console.log(reg.test("010-1234567")); 3 reg.lastindex = 0; 4 console.log(reg.test("0111-12345678")); 5 reg.lastindex = 0; 6 console.log(reg.test("021-123456")); 7 reg.lastindex = 0; 8 console.log(reg.test("21-12345678")); 9 /* 10 true 11 true 12 false 13 false 14 */
如果不把reg.lastindex属性设置为0,检测同一个字符串时将出现一次true一次false循环出现的情况。
2,exec()
检查字符串(子串)是否存在于被检测字符串,返回一个数组,包含被找到的值,并确定其位置。如果没有找到,则返回null。exec()方法返回的数组不只包含数组元素和length属性,还包括index和input两个属性,input表示被检索的字符串本身,index表示匹配到的第一个字符的位置。
另外,你可能已经有一个疑问了,上面的reg.lastindex是什么鬼?原来,当正则表达式指定了全局匹配时,验证行为就变得稍微复杂一些了。lastindex是正则表达式的一个属性,值是一个整数,执行检测时,程序将从 lastindex 属性指定的字符处开始检索字符串 ,lastindex属性默认是0,即从数组开头检索。当找到了与表达式相匹配的文本后,它将把lastindex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用检测方法来遍历字符串中的所有匹配文本。当方法再也找不到匹配的文本时,它将返回 null,并把 lastindex 属性重置为 0。
1 var str = "hello world, hello everybody."; 2 var patt = new regexp("hello","g"); 3 var result; 4 while (true) { 5 result = patt.exec(str); 6 if(result){ 7 console.log(result.index); 8 console.log(patt.lastindex); 9 }else{ 10 break ; 11 } 12 } 13 /* 14 0 表示第一次出现的“hello”的第一个字符的位置 15 5 表示第一次出现的“hello”的最后一个字符的下一个位置 16 13 表示第二次出现的“hello”的第一个字符的位置 17 18 表示第二次出现的“hello”的最后一个字符的下一个位置 18 */
六 支持正则表达式的字符串方法
1,replace()
替换匹配到的所有项,需要全局模式g。
1 var str = "hello world,hello everybody"; 2 str = str.replace(/hello/g,"hi"); 3 console.log(str);//"hi world,hi everybody"
2,split()
用匹配到的字符作为分隔符分隔字符串。
1 var str = "what is your name?"; 2 str = str.split(/\s+/); 3 console.log(str);//["what","is","your","name?"];
3,search()
返回字符串中第一个匹配到的字符串的位置,该方法总是忽略lastindex属性和全局模式g,所以他总是从开头查找,总是返回第一个出现的位置。
1 var str = "what is your name?"; 2 var index = str.search(/a/g); 3 console.log(index);//2
4,match()
以数组形式返回被匹配到的所有项,需要全局模式g才能返回所有的。
1 var str = "hello world,hello everybody."; 2 var arr = str.match(/ll/g); 3 console.log(arr);//["ll","ll"]
正则表达式在表单验证方面有着非常重要的应用,但使用他是每隔程序员的噩梦,因为创建它很容易,但读懂它却并非易事,所以在学习正则表达式时除了靠死记硬背,只能考经验的累积了。
上一篇: python全栈开发-前方高能-生成器和生成器表达式
下一篇: Python序列删除重复数据
推荐阅读
-
JAVA-4NIO之Channel之间的数据传输方法
-
NopCommerce架构分析之(五)Model绑定Action参数
-
php打包压缩文件之ZipArchive方法用法分析
-
NopCommerce架构分析之(六)自定义RazorViewEngine和WebViewPage
-
Java concurrency之公平锁(一)_动力节点Java学院整理
-
NopCommerce架构分析之(八)多语言支持
-
Java concurrency之集合_动力节点Java学院整理
-
C# Dynamic关键字之:调用属性、方法、字段的实现方法
-
Java concurrency之LockSupport_动力节点Java学院整理
-
C# Dynamic关键字之:dynamic为什么比反射快的详解