[关闭]
@Secretmm 2016-05-19T14:20:01.000000Z 字数 8771 阅读 2015

json,正则表达式

前端


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]/;

- test()方法

在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~z0~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次或者更多次。所以匹配上面正则表达式的字符串有gogoodgod等,但是getg就不匹配了。

<!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                位置和顺序
|                           选择符,“或”运算

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注