众所周知,在创建正则表达式的时候,有两种创建方式:
方式1:
var regex=/test/g;
方式2:
var regex=new RegExp("test","g");
可是在下面两段代码中为什么会不同?
怎么解释?
var s="D:\\Program Files\\Learning\\te\\";
s=s.replace(new RegExp("\\\\","g"),"/");
alert(s);var s="D:\\Program Files\\Learning\\te\\";
s=s.replace(/\\/g,"/");
alert(s);
上面两段代码的结果相同。
可是为什么new RegExp("\\\\","g")声明方式需要4个\,而
/\\/g声明方式需要2个\?
new RegExp("\\","g")声明方式如果为2个\,就没有任何效果呢?
在使用RegExp构造函数创建正则表达式的时候需要注意一些什么?
方式1:
var regex=/test/g;
方式2:
var regex=new RegExp("test","g");
可是在下面两段代码中为什么会不同?
怎么解释?
var s="D:\\Program Files\\Learning\\te\\";
s=s.replace(new RegExp("\\\\","g"),"/");
alert(s);var s="D:\\Program Files\\Learning\\te\\";
s=s.replace(/\\/g,"/");
alert(s);
上面两段代码的结果相同。
可是为什么new RegExp("\\\\","g")声明方式需要4个\,而
/\\/g声明方式需要2个\?
new RegExp("\\","g")声明方式如果为2个\,就没有任何效果呢?
在使用RegExp构造函数创建正则表达式的时候需要注意一些什么?
new RegExp("B","g")个人理解为:
1、A是正则表达式,B是正则表达式的字符串形式
2、对A的特殊字符转义,得到B
var regex=/test/g;
方式2:
var regex=new RegExp("test","g"); 这两种是等价的!
呵呵
By David Flanagan :In JavaScript, regular expressions are represented by RegExp objects. RegExp objects may be created with the RegExp( ) constructor, of course, but they are more often created using a special literal syntax. Just as string literals are specified as characters within quotation s, regular expression literals are specified as characters within a pair of slash (/) characters. Thus, your JavaScript code may contain lines like this:var pattern = /s$/;
第一个参数是字符串,‘\’在字符串中是特殊符号,用于转义,所以"\\" 才是表示一个 '\'符号
前面的'\'把后面的那个转成真正表示'\'符号,
故“\\\\”才表示我们所真正需要的两个 \ 符号而正则表达式中 '\' 也同样具有转义效果,所以此时的两个"\" 到了正则表达式中真正表示的其实只是一个'\',new RegExp("\\","g") 所以你的这个不会有效果
首先解释下为什么在声明上会有差别吧RegExp("\\\\","g")
这种声明方式中,是以字符串的方式声明正则,至于为什么需要4个\,换个角度解释吧
比如要匹配的字符是这样的
var str = "(";
那么正则如何写呢?因为“(”在正则中是有特殊意义的,所以写正则时必须对它进行转义,即\(
在字符串中,要使用“\\”来表示“\”本身,也就是
var regex=new RegExp("\\(","g");
这个理解了,那再把“(”换回“\”,同样道理,因为“\”也是有特意义的,在字符串中,要使用“\\”来表示“\”本身,也就是
var regex=new RegExp("\\\\"g");
而如果使用的是两上\\,事实上编译时是会报错的,因为编译为正则时,它就是一个转义符“\”,那它转义的是什么呢?后面什么都没有,编译自然出错的
var regex=new RegExp("\\","g"); /\\/g声明方式将被直接解释为正则表达式中的元字符,不需要再转义,所以两个\即可用字符串来声明正则这种方式,遇到“\”确实很容易让人费解,Java和JavaScript中都是这样,而在.NET中则提供了@,在前面加了@的字符串可以忽略转义,这样写正则即使是用字符串形式声明也简洁多了
Regex reg = new Regex(@"\\");再说下两种声明方式有区别的应用场景吧
就我目前所接触的JavaScript的正则中
/\\/g
这种方式简洁,可读性强,而
RegExp("\\\\","g")
这种方式可以通过变量来动态生成正则表达式
var s="D:\nProgram Files\nLearning\nte\n";
s=s.replace(/\\/g,"/");
alert(s);这样写,可能就明白了吧。。你试试