正则表达式种双反斜杠问题\

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
原文地址:https://www.cnblogs.com/taohuaya/p/9652184.html