@Secretmm
2016-05-19T14:20:01.000000Z
字数 8771
阅读 2015
前端
JSON
,全称“JavaScript Object Notation
(JavaScript对象表示法)
http://www.lvyestudy.com/tools/json_editor.aspx
http://www.lvyestudy.com/tools/regexpal.html
、正则表达式简介
正则表达式
正则表达式,全称“Regular Expression”,在代码中常简写为regex、regexp或RE。正则表达式,就是用某种模式去匹配一类字符串的公式(仔细琢磨这句话)。
怎么理解呢?在大多数大型网站都有注册功能,注册的表单都会有相应的验证,例如姓名表单要求输入汉字,邮箱表单必须要符合电子邮箱的模式。那程序是怎么判断用户输入的内容是否符合相应表单的要求呢?这就用到了JavaScript中的正则表达式。
表单中的正则表达式
在电子邮箱表单中,我们使用JavaScript定义一种“模式”,如果用户输入的内容符合这种模式,就通过,如果用户输入的内容不符合这种模式,就报错。上面所说的这种模式指的就是“正则表达式”。
正则表达式是什么
学习正则表达式就是学习怎样定义一种“模式”的语法,说白了,就是学习各种匹配的规则,例如匹配数字要怎么要怎么写,匹配字符怎么写等等。
正则表达式往往需要2部分内容:被验证的字符串和正则表达式。我们把“需要被验证的字符串”比喻成“需要被检验的产品”,把“正则表达式”比喻成“格式工厂”(字符串的格式工厂),这样就很形象了。一般需要被检验的产品在生产流水线时候,合格的就通过,不合格的就扔掉。现在大家对正则表达式都能很好地理解了吧?
在学习正则表达式之前,有几点要跟大家说明一下:
(1)正则表达式在大部分语言中的语法结构是大同小异的,学完JavaScript中的正则表达式,再去学习其他语言的正则表达式是相当容易的一件事;
(2)正则表达式是一门很有用的技术,在各种程序设计语言有着广泛的应用,通常用来处理字符串,如匹配字符串、查找字符串、替换字符串等;
总结
1、正则表达式,就是用某种模式去匹配一类字符串的公式;
2、学习正则表达式就是学习怎样定义一种“模式”的语法,说白了,就是学习各种匹配的规则,例如匹配数字要怎么要怎么写,匹配字符怎么写等等;
3、正则表达式常见于表单验证、字符串操作。
在JavaScript中,正则表达式是由一个RegExp对象表示的,利用RegExp对象来完成有关正则表达式的操作和功能。
正则表达式的定义共有2种方式:
(1)显式定义;
(2)隐式定义;
1、显式定义
所谓的“显式”就是让大家一眼就看出这就是正则表达式的定义,足够明显。
显式定义必须是使用new
关键词来定义。
语法:
var 变量名 = new RegExp("正则表达式模式");
说明:
显式定义的正则表达式必须要使用双引号括起来,这里要注意字符串的转义。
2、隐式定义
所谓的“隐式”指的是有点阴阴湿湿,没那么明显,大家可能一眼没有看出这是正则表达式的定义。
语法:
var 变量名 = /正则表达式模式/
说明:
隐式定义的正则表达式开头和结尾都必须是斜杠“/”。记得使用隐式定义的正则表达式是不需要使用双引号括起来的,这一点跟显式定义的正则表达式不一样!
隐式定义是最常用的方式,建议大家以后都使用这种方式定义正则表达式,代码量少并且方便。
举例:
var myregex = new ReExp("[0-9]");
上面语句等价于下面:
var myregex = /[0-9]/;
在JavaScript中,可以使用RegExp
对象的test()
方法来指出被查出的字符串中是否匹配正则表达式模式。
语法:
regex.test(str)
说明:
regex
为必选项,表示正则表达式模式。
str
为必选项,表示字符串。
该方法返回一个boolean
值。也就是说,test()
方法检查字符串str
是否符合正则表达式模式rgexp
,如果符合,则返回true
;如果不符合,则返回false
。
怎么更好的理解test()
方法呢?举个例子,验证邮政编码的正则表达式模式为“ \d{6}
”。“\d{6}
”表示6个字符都是数字,如果某一个字符串符合“6个字符都是数字”这种模式,那么test()
方法就返回true
,如果不符合,则返回false
。
例如字符串“510632
”就符合正则表达式模式“\d{6}
”。而字符串“abc123
”或“lvyestudy
”就不符合正则表达式模式“\d{6}
”,因为“abc123
”虽然是6个字符,但是不符合所有字符都是数字。而“lvyestudy
”不符合得原因有2点:①字符超过6个字符;②字符都不是数字。
举例:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
var str1="510632";
var str2="lvyestudy";
//定义正则表达式
var myregex = /\d{6}/;
//判断字符串str1是否匹配正则表达式myregex
if(myregex.test(str1))
{
document.write("'510632'是正确的邮政编码"+"<br/>");
}
else
{
document.write("'510632'不是正确的邮政编码"+"<br/>");
}
//判断字符串str2是否匹配正则表达式myregex
if(myregex.test(str2))
{
document.write("'lvyestudy'是正确的邮政编码");
}
else
{
document.write("'lvyestudy'不是正确的邮政编码");
}
</script>
</head>
<body>
</body>
</html>
在正则表达式中,包括2种字符:
(1)普通字符;
(2)特殊字符(元字符);
普通字符就是a~z
、0~9
这类常见的字符。其中特殊字符又称为“元字符”。元字符之所以叫特殊字符,就是它的特点跟普通字符不一样。例如邮政编码中,我们限定只能输入6个数字,那“数字”这个概念怎么理解呢?这个时候我们就用到了元字符\d
来代替。
正则表达式常用的元字符如下:
元字符 说明
\d 匹配数字,相当于[0-9]
\D 匹配非数字,相当于[^0-9]
\w 匹配字母或数字或汉字或下划线
\W 匹配任意不是字母、数字、汉字或下划线的字符
\s 匹配任意的空白符,如空格、换行符、制表符等
\S 匹配任意不是空白符的字符
.(点号) 匹配除了换行符以外的任意字符
[...] 匹配方括号中的所有字符
[^...] 匹配非方括号中的所有字符
举例1:
0\d{2}-\d{8}
分析:
其实上面这个正则表达式匹配的是中国的电话号码,以0
开头,然后是两个数字,然后是一个连字号“-
”,最后是8
个数字。\d{2}
表示数字重复2次,\d{8}
表示数字重复8次。记住,\d
匹配是“数字”,很常用。{2}
、{8}
这些是限定符的内容
举例2:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
var str="020-1234567";
//定义正则表达式
var myregex = /0\d{2}-\d{8}/;
//判断字符串str是否匹配正则表达式myregex
if(myregex.test(str))
{
alert("匹配");
}
else
{
alert("不匹配");
}
</script>
</head>
<body>
</body>
</html>
举例3:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
var str="<h7>";
//定义正则表达式
var myregex = /<h[123456]>/;
//判断字符串str是否匹配正则表达式myregex
if(myregex.test(str))
{
alert("匹配");
}
else
{
alert("不匹配");
}
</script>
</head>
<body>
</body>
</html>
分析:
var myregex = /<h[123456]>/
;这一句中,[123456]
表示可以匹配1~6
中任意一个数字。上面正则表达式的实际作用是匹配HTML标签中的<h1>、<h2>、<h3>、<h4>、<h5>和<h6>
。
举例4:
[hH]ello
分析:
上面正则表达式可以匹配2个字符串“hello
”或“Hello
”。
连接符简介
学习了正则表达式常用元字符,我们知道要想匹配数字,正则表达式就要这样写:
[0123456789]
其中[]
表示匹配方括号内的任一字符。在正则表达式中,匹配数字或者英文字母的书写非常不方便。因此,正则表达式引入了连接符“-
”来定义字符的范围。
正则表达式连接符
连接符 说明
[0-9] 匹配数字,等价于\d
[a-z] 匹配英文小写字母
[A-Z] 匹配英文大写字母
[0-9a-zA-Z] 匹配数字或英文字母
其中[0-9]等价于[0123456789],以此类推。上面的搭配都是最常用的。当然你也可以用[0-6]表示0~6,或者[h-n]表示h~n。
举例:
[^0-9a-zA-z]
分析:
上面正则表达式匹配非数字、英文字母
的其他字符。
什么叫限定符?
限定符,就是限定某个或某类字符出现的次数。例如,邮政编码都是6位数,因此对于表单中的邮政编码,我们在正则表达式中要限定其为6位数字。匹配邮政编码的正则表达式是“\d{6}
”,其中“{6}
”就是限定符。
常用的正则表达式限定符如下:
限定符 说明
+ 重复1次或更多次(最少一次)
* 重复0次或更多次(任意次数)
? 重复0次或1次(最多1次)
{n} 重复n次
{n,} 重复n次或更多次(最少n次)
{n,m} 重复n到m次
二、常用的限定符
1、+
在正则表达式中,使用+限定前导字符重复1次或更多次。
举例:
go+
分析:
由于使用了+限定符,因此字母o
必须出现1次或者更多次。所以匹配上面正则表达式的字符串有go
、good
、god
等,但是get
、g
就不匹配了。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
var str="good";
//定义正则表达式
var myregex = /go+/;
//判断字符串str是否匹配正则表达式myregex
if(myregex.test(str))
{
alert("匹配");
}
else
{
alert("不匹配");
}
</script>
</head>
<body>
</body>
</html>
正则表达式限定符
大家在正则表达式测试工具中验证的可能会发现,对于good
这个字符串:咦?高亮的部分怎么是goo
,而不是good
呢?上面JavaScript
使用test()
方法测试中不是说“good
”匹配正则表达式go+
吗?
是这样的,在正则表达式测试工具中,只是把good这个字符串符合go+的部分高亮出来。也就是说,只要字符串有一部分或者全部匹配正则表达式的话(字符串在正则表达式测试工具能高亮),使用JavaScript的test()方法时返回值都是true,也就是说这个字符串匹配该正则表达式。
2、*
在正则表达式中,使用*限定前导字符重复0次或更多次(任意次数)。
举例:
go*
分析:
由于使用了*
限定符,因此字母o
必须出现0
次或者更多次。所以匹配上面正则表达式的字符串有g、go、good、god等,但是get等就不匹配了。注意一下,在这里字符串g
是匹配的,*
限定符跟+限定符不一样,因为+限定符限定前导字符必须出现1次以上。
3、?
在正则表达式中,使用?
限定前导字符重复0
次或1
次(最多1次)。
举例:
go?
分析:
由于使用了?
限定符,因此字母o
必须出现0
次或者1
次。所以匹配上面正则表达式的字符串只有g、go这2种,其他的诸如god、good、get等就不匹配了。
我们都知道“颜色”的英文是color或者colour,这个时候我们可以使用?限定符。
colou?r
表达式u?表示字母“u”可以出现1次或者不出现。
4、{n}
在正则表达式中,使用{n}
限定前导字符重复n次。
举例:
go{3}
分析:
由于使用了?
限定符,因此字母o
必须出现3次。所以匹配上面正则表达式的字符串只有gooo这1种,其他的诸如god、good、get等就不匹配了。
5、{n,}
在正则表达式中,使用{n,}限定前导字符重复n次或更多次。
go{3,}
分析:
由于使用了?限定符,因此字母o必须出现3次或更多次。所以匹配上面正则表达式的字符串只有gooo,goooo,gooooo……。
6、{n,m}
在正则表达式中,使用{n,m}限定前导字符重复n到m次(也就是n~m之间任意一个次数)。
举例:
go{1,3}
分析:
由于使用了?限定符,因此字母o必须出现1~3次。所以匹配上面正则表达式的字符串只有go、goo、gooo这3种。
在正则表达式中,定位符,说白了,就是限定某些字符出现的位置。
常用的正则表达式定位符如下:
定位符 说明
^ 限定开始位置的字符
$ 限定结尾位置的字符
\b 限定单词(字)边界的字符
\B 限定非单词(字)边界的字符
二、常用定位符
1、^
在正则表达式中,使用^
定位符来限定开始位置的字符。
由于使用了^
定位符,因此字符串中必须以a
开头。所以匹配上面正则表达式的字符有abc、absolute等以a开头的字符串,但是back、123等就不匹配了。
深入了解上尖号
^a
[^a]
分析:
上尖号的使用有2种情况:(1)定位符;(2)[^…]元字符。
很多初学者容易混淆上尖号,其实大家可以这样理解:上尖号,只有一种特殊情况,就是[^…]这种元字符的时候,上尖号才表示“非”,其他情况,上尖号都是表示定位符。
2、$
在正则表达式中,使用$定位符来限定结尾位置的字符。
分析:
由于使用了$
定位符,因此字符串中必须以a结尾。所以匹配上面正则表达式的字符串有panda、nana等以a结尾的字符串,但是abc、helicopter等就不匹配了。
3、\b
在正则表达式中,使用\b
定位符来限定一个单词开始或结束时的字符。怎么理解呢?请看下面的例子。
\b
包含了字与空格间的位置,以及目标字符串的开始和结束位置等。
举例1:
er\b
分析:
“er\b
”匹配“order to
”中的er
,但不匹配“verb
”中的“er
”。
举例2:
\ba[a-z]{7}\b
分析:
上面正则表达式匹配以字母“a
”开头的长度等于8
的任意单词。因此\b
限定了单词的开头和结尾。
使用2个\b
来匹配一个单词,这是很 常用的方法。如果大家以后见到正则表达式中有2个\b
,也应该知道这是匹配单词的。
4、\B
在正则表达式中,使用\B
定位符来限定一个非单词开始或结束时的字符。
举例:
er\B
分析:
“er\B
”匹配“verb
”中的“er
”,但不匹配“order to
”中的“er
”。
\B用得比较少,而\b用得更多一些,因为往往都是\b来匹配一个单词什么,也很好用。
如果我们要匹配正则表达式中的特殊字符,我们就必须在该特殊字符前面加上反斜杠“\
”将其进行转义。
在正则表达式中,分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中,分组使用的字符为“(”和“)”,即左圆括号和右圆括号。分组之后,用小括号括起来的表达式看出一个整体来处理。
举例:
/(abc){2}/
/[abc]{2}/
/(a[h-n]){2}/
① 使用()
把abc
分为一组;
② {2}
表示把(abc)
这一组重复2
次;
因此,这个正则表达式匹配的是必须包含abcabc的字符串。
第二个正则表达式:
① [abc]
表示匹配a、b、c
中任意一个字符;
② {2}
表示把[abc]
重复2
次;
因此,这个正则表达式匹配的字符是ab、dac、cfbchj
等中含有a、b、c中任意两个字符组合(比如ab、bc、ac)的字符串。
第三个正则表达式:
① [h-n]
表示匹配字母h~n
中任意字母;
② 使用小括号()
把a[h-n]
分成一组;
③ 然后使用限定符{2}
使得该组必须重复2次
因此,正则表达式匹配的字符有:aiai、ajaj123
这一类。
对于正则表达式中的分组,用一句话理解,就是把某几个字符当做一个整理来处理。
选择符,很简单。在正则表达式中,选择符是“|
”,用于选择匹配2个选项之中的任意一个,类似JavaScript中的“或”运算。
例如,“abc|def1
”匹配的是“abc
”或“def1
”,而不是“abc1
”或“def1
”。如果要匹配“abc1
”或“def1
”,应该使用分组符,即“(abcd|efgh)1
”。
举例:
(h|H)ello
分析:
上面正则表达式可以匹配2个字符串“hello
”或“Hello
”,等价于hello|Hello
或[hH]ello
。
语法:
(?#注释的内容)
优先级顺序
运算符或表达式 说明
\ 转义符
()、(?:)、(?=)、[] 圆括号或方括号
*、+、?、{n}、{n,}、{n,m} 限定符
^、$、\b、\B 位置和顺序
| 选择符,“或”运算
上面优先级是从高到低排列。这些优先级顺序并不需要刻意去记忆,平常用得到了,自然而然就知道。
一、基本语法
1、正则表达式是什么?
正则表达式,就是用某种模式去匹配一类字符串的公式。学习正则表达式就是学习怎样定义一种“模式”的语法,说白了,就是学习各种匹配的规则,例如匹配数字要怎么要怎么写,匹配字符怎么写等等。
2、正则表达式的定义
正则表达式的定义共有2种方式:
(1)显式定义;
(2)隐式定义;
举例:
var myregex = new ReExp("[0-9]"); //显式定义
var myregex = /[0-9]/; //隐式定义
3、test()
方法
test()
方法返回一个boolean值。也就是说,test()
方法检查字符串str是否符合正则表达式模式rgexp,如果符合,则返回true;如果不符合,则返回false。
二、正则语法
1、常用元字符
正则表达式常用的元字符如下:
正则表达式元字符
元字符 说明
\d 匹配数字,相当于[0-9]
\D 匹配非数字,相当于[^0-9]
\w 匹配字母或数字或汉字或下划线
\W 匹配任意不是字母、数字、汉字或下划线的字符
\s 匹配任意的空白符,如空格、换行符、制表符等
\S 匹配任意不是空白符的字符
.(点号) 匹配除了换行符以外的任意字符
[...] 匹配方括号中的所有字符
[^...] 匹配非方括号中的所有字符
2、连接符
在正则表达式中,匹配数字或者英文字母的书写非常不方便。因此,正则表达式引入了连接符“-”来定义字符的范围。
正则表达式连接符
连接符 说明
[0-9] 匹配数字,等价于\d
[a-z] 匹配英文小写字母
[A-Z] 匹配英文大写字母
[0-9a-zA-z] 匹配数字或英文字母
3、限定符
限定符,就是限定某个或某类字符出现的次数。
常用的正则表达式限定符如下:
正则表达式限定符
限定符 说明
+ 重复1次或更多次
* 重复0次或更多次(任意次数)
? 重复0次或1次(最多1次)
{n} 重复n次
{n,} 重复n次或更多次(最少n次)
{n,m} 重复n到m次
4、定位符
在正则表达式中,定位符,说白了,就是限定某些字符出现的位置。
正则表达式定位符
定位符 说明
^ 限定开始位置的字符
$ 限定结尾位置的字符
\b 限定单词(字)边界的字符
\B 限定非单词(字)边界的字符
5、转义字符
我们都知道正则表达式包括2种字符:(1)普通字符;(2)特殊字符。如果我们要匹配正则表达式中的特殊字符,我们就必须在该特殊字符前面加上反斜杠“\”将其进行转义。
举例:
go\+
分析:
因为+是正则表达式的特殊符号,因此必须在+
前面加上“\
”对其进行转义。
例如要匹配字面意义的“\
”,就需要使用“\\
”表示。
需要转义的字符有:$、(、)、*、+、.、[、]、?、\、/、^、{、}、|
。这些字符都不需要记忆,见得多就自然而然记住了。
6、分组
分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中,分组使用的字符为“(”和“)”,即左圆括号和右圆括号。分组之后,用小括号括起来的表达式看出一个整体来处理。
7、选择符
选择匹配符,很简单。在正则表达式中,选择匹配符是“|”,用于选择匹配2个选项之中的任意一个,类似JavaScript中的“或”运算。
例如,“abc|def1”匹配的是“abc”或“def1”,而不是“abc1”或“def1”。如果要匹配“abc1”或“def1”,应该使用分组符,即“(abcd|efgh)1”。
8、注释
语法:
(?#注释的内容)
说明:
如果要在正则表达式中包含注释,则最好打开“忽略模式里的空白符”选项。因此,此时可以在注释中添加空格、换行符号、制表符号等。一旦启用了该选项,即符号#之后的内容会全部被忽略掉。
这种注释方式暂时并未被JavaScript支持,但是其他高级语言可能使用到。对于学习前端的同学,可以忽略这个知识点。
9、优先级顺序
优先级顺序
运算符或表达式 说明
\ 转义符
()、(?:)、(?=)、[] 圆括号或方括号
*、+、?、{n}、{n,}、{n,m} 限定符
^、$、\b、\B 位置和顺序
| 选择符,“或”运算