zoukankan      html  css  js  c++  java
  • 正则表达式种双反斜杠问题\

    var re1 = /d+.d+/;
    alert(re1);//结果是 /d+.d+/ 和声明的正则re1一样
    /*这里的 
    n(n>0)个数字 符号点 n(n>0)个数字
    既:9.9、12.134、56362.151415 等
    */
    var str1 = '134.32';
    alert(re1.test(str1));//true

    /*接下来
    我们根据感觉改成用new RegExp声明正则*/

    var re2 = new RegExp('d+.d+'); 
    alert(re2);//结果 /d+.d+/

    //根据我们弹出的 正则表达式/d+.d+/分析
    /*可见输出的结果并不是我们想要的正则表达式,这个表达式的意思:
    d+表示 n(n>0)个d
    .表示匹配除换行符意外的任意字符
    后边d+表示 n(n>0)个d。
    既 d.d 、dd.dd 、dad、ddydd 等
    */

    var str2 = 'ddyd';
    alert(re2.test(str2));//true

    那么
    问题出在了哪里,我们来分析一下,我们都知道正则表达式它本质上
    也是一个字符串,但是功能比一般的字符串要强很多,所以可以称作是
    超级字符串。我们在用new RegExp('正则')声明正则表达式的时候,
    可以看出是用引号包着的,我们都知道在js里,' '引号可以用来声明
    字符串(/ / 用来声明正则)。所以这里更可以看出是正则表达式也
    是字符串了。
    而在字符串里 反斜杠是有特殊含义的,就是用来转移字符。
    所以我们我们上面写的new RegExp('d+.d+');就有问题了。
    本来我们是想用d表示匹配任意的数字的。配合元字符+后有n(n>0)
    个数字的。
    因为反斜杠有转义的意思所上面的
    d 被转义成了d
    . 被转义成了. (.点在正则中表示匹配除换行符以外的
    任意字符)
    所以被引号包着的正则表达式字符串'd+.d+'被转换成真正
    的正则表达式之后就成了/d+.d+/
    所以就有了上面描述的现象。

    /*既然如此我们只要合理的利用转义字符反斜杠\,就可以使用
    new RegExp('')声明的正则和直接用 / / 声明的正则达到一样的效
    果。

    思路:
    1.确定我们想要的正则表达式:/d+.d+/
    【注】两边的斜杠 / 是用来声明正则的,里面的内容d+.d+是
    表达式的式子,式子和 斜杠/合起来才叫正则表达式
    2.把正则表达式的式子放到引号(字符串)里'd+.d+',很明显这样是不
    行的,里面的反斜杠被当成了用来转义标识,所以我们要把 再加一个
    \,即:'\d+\.\d+'这样第一个反斜杠就把第二个反斜杠转成了反斜杠
    这样这个字符串''正则,转换成斜杠/ / 正则的时候就成了我们想要的/ d+.d+/了。
    */

    //下面我们进行测试一下

    var re3 = new RegExp('\d+\.\d+');
    alert(re3);//结果 /d+.d+/
    
    var str3 = '32.1';
    alert (re3.test(str3)); //true

    /*可以看出现在达到里我们向要的效果,从alert(re3);得到的结果/d+.d+/就可以看出没错了。
    转义标识反斜杠在通过new RegExp('\d+\.\d+')声明的正则和 / /声明的正则中都内转义,
    在/d+.d+/这里边为什么没有把d转成d?
    因为/d+.d+/这种形式就是正则表达式的形式,而在正则表达式里有明文规定d这种写法代
    表的意思,所以在执行正则表达式的时候遇到反斜杠后,一看后面还有个d自然就不转义。(d这
    种具有特殊含义的字符叫做元字符)。
    但是通过new RegExp 加字符串'';声明的,因为这些有特殊含义的字符在字符串里他们并不认为
    有特殊含义。所以要多加一个\,这样等转换成斜杠/ /方式的时候还有一个反斜杠.*/

    /*在这里我们再附加一个小例子
    用new的方式声明正则表达式。可以匹配字符串hello,e和l之间有n(n>0)个+号;
    */

    var re4 = new RegExp('he\++llo'); 
    /*第一个是转义标识负责把第二转换成符号
    然而在/he++llo/里又成了一个转义标识,他把后面的+从正则表达式的重复字符变成了
    纯符号+,紧随其后的+因为没有转义,所以它是正则的重复字符,多以他代表有n(n>0)个
    前面的符号+*/
    alert(re4); //结果 /he++llo/
    var str4 = 'he+++++llo';
    alert(re4.test(str4));//true
  • 相关阅读:
    chroot 与 jail
    3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
    一种监控全部账户登陆及操作命令的方法
    怎样设计接口?
    UVA10869
    网络直播电视之M3U8解析篇 (下)
    LCD显示--Ht1621b芯片显示屏驱动
    混淆
    android 调试
    eclipse+webservice开发实例
  • 原文地址:https://www.cnblogs.com/taohuaya/p/9652184.html
Copyright © 2011-2022 走看看