• JavaScript正则表达式


    说到JavaScript中的正则表达式,JavaScript程序员尤其是新手都会有这么一个印象:难!为什么这么说,先上一个例子:

    regexp = /[a-z0-9!$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)/   
    

    天哪!这究竟是什么东西!眼尖的同学可能已经扫到了其中的一个@符号,没错,这个正则表达式的作用就是用来匹配一个字符串中的email地址。看着这些让人眼花缭乱的符号,相信很多人在心里已经开始打退堂鼓了(典型的80后句式,其实我到现在也没弄清楚什么是退堂鼓。哈哈哈哈。)。于是相当一部分同学采取的态度就是,真正到了迫不得已要使用的时候,上度娘或者谷歌搜索例如“邮件地址正则表达式”等等,然后复制粘贴。ok,这种方法确实无可厚非,必须承认大部分时候搜索引擎就是干这个活的。但是,我们在现实项目中遇到的需求千变万化,你能保证每次都能顺利搜索到想要的结果吗?而且大部分搜索到的结果的更新日期都是几年前,你看了之后不禁有点发毛,心里已经开始嘀咕了:这真的能用嘛?当然我们还有一个方法,在Stackoverflow等地方提问,等待别人回答,但是得到回答的时间久不敢保证了。

    说了这么多,主要就是说明一个事情:我们需要自己掌握JavaScript中的正则表达式。其中的好处我就不多赘述了,但是升职加薪,当上CEO,迎娶白富美,成为人森赢家都是很有可能的。听起来是不是有些小激动呢?先别忙着激动,先学会了正则表达式才是一切的前提条件。

    什么是正则表达式

    一个正则表达式就是一个用来描述字符模式的对象,它被用来在文本中执行模式匹配(pattern-matching)以及”查找-替换”(search-and-replace)的任务。

    说的直白朴素一点,正则表达式就是我们用来匹配一段特定字符串的东西。比如说我们熟悉的email地址,如果有一个从来没见过email地址的人问你:“亲,能给我描述一下邮件地址是怎么样的一个东西嘛?”你可能会说:“呃。。。首先有一串字符,它的长度不限,可以是大写字母、小写字母、下划线、连字符、数字。。。。中间是一个@符号,它必须存在。然后是一个代表邮件提供商的字符串,比如说gmail、163、outlook。。。。最后是一个后缀,可以是.com、.net等等等。。。。我说完了。”是不是感觉好长,其实正则表达式就是干了这么一件事,比如说上面我们看到的那个异常复杂的用来描述一个email地址的正则表达式,它就是用它自己语言来替代了我们刚才说的那一段话,然后JavaScript解释器马上理解了它的意思,然后开始干活。现在回头一想,正则表达式其实非常的简洁且优美,整个表达过程没有一句废话,不像我们说话的时候会加上许多类似“额,嗯,那个,这个,呵呵,么么哒”等口头禅。可能这也是那些有代码洁癖的程序员喜欢正则表达式的一个原因吧。

    基本语法

    JavaScript中正则表达式的基本语法形式非常简单,就像一般JavaScript中对象有字面量表示法和构造器函数法一样,JavaScript中的正则表达式也有两种写法:

    var part = new RegExp(pattern,modifiers);
    

    这是常规写法,其实就是用new生成了一个RegExp对象的实例而已,很好理解。其中的pattern就是正则表达式的主体,也就是我们需要描述的模式,而后面的modifiers是什么呢?它用来说明是不是需要进行全局搜索,大小写敏感等等事项。对于一般的JavaScript对象,比如说函数,我们一般不会采取构造器函数法。例如:

    var myfunc = new Function([name],'alert("Hello" + name)');   
    

    但是正则表达式的这个构造器函数法我们确经常需要使用,所以要记住。当然,我们还有简单的写法:

    var patt = /pattern/modifiers;   
    

    正则表达式中的modifiers

    前面已经提到了modifier,它主要用来指明模式是否对大小写敏感以及是否全局搜索。

    其中的i用来指明是否对大小写敏感。

    其中的g用来指明是否进行全局搜索。(即匹配所有符合模式的字符串而不是搜索到第一个就停止)

    其中的m用来指明是否进行多行匹配。(即遇到转义换行符 是否还继续搜索)

    经常用到的是前面两个i和g,m不是很常用。

    下面是几个例子:

    例子1:

    var str = 'Visit W3School';
    var patt1 = /w3school/i;
    

    如果用patt1来匹配str,由于我们在patt1中指明了i,即对大小写不敏感,因此只要str中包含w3school这一串字母,无论全是大写,全是小写,或者大小写混合,都可以被匹配到。因此str中的W3School能被匹配到。

    例子2:

    var str = "Is this all there is?";
    var patt2 = /is/g;   
    

    如果用patt2来匹配str,由于我们在patt2中指明了g,即进行全局匹配,因此匹配不会在找到第一个匹配项目时就停止。在str中,我们发现能匹配上的有两个地方,一个是this中的is,另一个是问号前面的is,而开头的Is由于第一个字母是大写,而我们的正则表达式并没有指明对大小写不敏感,因此不符合要求。

    例子3:

    var str="Is this all there is?";
    var patt3=/is/gi;  
    

    在patt3中我们既指明了对大小写不敏感,也指明了全局搜索,因此你可能已经猜到了,能匹配到的项目有IS,this中的is以及问号前面的is。

    例子4:

    var str = "
    Is th
    is it?";
    var patt4 = /^is/m;   
    

    在patt4中我们指明了m,即换行匹配,而我们在这里看到了一个^符号,它表示匹配以is开头的项目。我们回到我们字符串str中,由于其中有转移换行符 ,因此字符串真正的样子应该是:

    IS th   
    is it?   
    

    因此很明显,我们的patt4可以匹配到第一行结束时还没有找到匹配项目,但是不会停下,继续第二行的匹配,因此就匹配到了第二行中的is,它也是以is开头的字符串,符合要求。

    JavaScript正则表达式对象的方法

    JavaScript中正则表达式对象一共有4个方法。

    1.compile()。它将编译一个正则表达式。该方法已经在JavaScript version 1.5中被弃用。

    2.exec()。该方法将对一个字符串进行匹配。并返回第一个匹配项目。例如:

    var patt1=new RegExp("e"); 
    patt1.exec("The best things in life are free");

    结果将返回e,即第一个匹配到的项目。

    3.test()。该方法对一个字符串进行匹配。并根据匹配结果返回true或false。例如:

    var patt1=new RegExp("e");   
    patt1.test("The best things in life are free"); 
    

    结果将返回true。因为字符串中含有能匹配上的项目e。

    4.toString()。该方法将正则表达式对象转换为一个字符串。例如:

    var patt = new RegExp("Hello World","g");
    patt.toString();
    

    结果将返回一个字符串’/Hello World/g’。

    以上就是正则表达式最简单的知识,在学习完这个系列之后,我相信你一定能狗看懂最开始的那个吓人的正则表达式,并且能够写出更复杂的正则表达式。千里之行始于足下,正则高手也是从正则菜鸟开始的。


    本文参考自JavaScript.info,原文地址http://javascript.info/tutorial/regular-expressions-javascript

  • 相关阅读:
    网页版游戏(俄罗斯方块)
    模拟简单进程调度实验
    从小型网站到超大规模网站的MySQL参考架构
    Google Chart Tools学习笔记 二 Area Chart
    大话设计模式——建造者模式
    内存管理:分页,分段,段页结合
    2012第50周星期一自制力网摘
    第49周星期五糟糕破系统
    2012年第50周四
    2012第50周五
  • 原文地址:https://www.cnblogs.com/hr2014/p/3776201.html
Copyright © 2020-2023  润新知