众所周知,在创建正则表达式的时候,有两种创建方式:
方式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.   

    /A/g
    new RegExp("B","g")个人理解为:
    1、A是正则表达式,B是正则表达式的字符串形式
    2、对A的特殊字符转义,得到B
      

  2.   

    方式1: 
    var regex=/test/g; 
    方式2: 
    var regex=new RegExp("test","g"); 这两种是等价的!
    呵呵
      

  3.   

    一样的:简便写法而已:JavaScript: The Definitive Guide, 5th Edition 
    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$/;
      

  4.   

    对于 new RegExp("\\\\","g") 应该这样理解
    第一个参数是字符串,‘\’在字符串中是特殊符号,用于转义,所以"\\" 才是表示一个 '\'符号
    前面的'\'把后面的那个转成真正表示'\'符号,
    故“\\\\”才表示我们所真正需要的两个 \ 符号而正则表达式中 '\' 也同样具有转义效果,所以此时的两个"\" 到了正则表达式中真正表示的其实只是一个'\',new RegExp("\\","g") 所以你的这个不会有效果
      

  5.   


    首先解释下为什么在声明上会有差别吧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")
    这种方式可以通过变量来动态生成正则表达式
      

  6.   


    var s="D:\nProgram Files\nLearning\nte\n";
    s=s.replace(/\\/g,"/");
    alert(s);这样写,可能就明白了吧。。你试试