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

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值