代码之家  ›  专栏  ›  技术社区  ›  4imble

JavaScript拒绝了我所有的正则表达式,为什么?

  •  2
  • 4imble  · 技术社区  · 16 年前

         var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
         someText.replace(exp, "<a href='$1'>$1</a>");  
    

    它将取代任何 http://URL 用适当的 <a href>

    但我也要求它匹配www.而不使用http。我在RegEx Lib上找到了这个正则表达式。

    ((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?
    

    我在RegEx checker网站上测试过, http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp

    它符合我想要的字符串。但当我把它放到exp var中时,JavaScript正在崩溃并导致一个错误。

    我甚至试着像这样把它换成一个新的RegExp。

    var exp = new RegExp(((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?);
    

    但同样的事情也发生了。

    你知道我做错了什么吗?

    谢谢,

    3 回复  |  直到 16 年前
        1
  •  6
  •   Amarghosh    16 年前

    我相信RegExp构造函数以字符串作为参数,请参见: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp

    所以只要在regexp周围加上引号就可以了。

    var exp = new RegExp("((http\\://|https\\://|ftp\\://)|(www.))+(([a-zA-Z0-9\\.-]+\\.[a-zA-Z]{2,4})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\\?\\.'~]*)?");
    someText.replace(exp, "<a href='$1'>$1</a>");
    
        2
  •  2
  •   Alan Moore Chris Ballance    16 年前

    好的,你已经把JavaScript语法弄清楚了,现在让我们来谈谈 正则表达式 : . )还有问号( ? )通常有特殊的含义,但当它们出现在字符类中(即方括号内)时就没有了。

    连字符( - ) 在字符类中有特殊意义:它形成范围,如 [a-z] [0-9] . 如果要在字符类中包含文字连字符,可以使用反斜杠对其进行转义,或者将其放在列表的开头或结尾。例如,在 [a-zA-Z0-9\.-] 最后一个连字符与一个连字符匹配,而其他三个连字符用于构成范围(点前面的反斜杠是不必要的,但它不会损害任何东西。)

    现在看看 [a-zA-Z0-9%:/-_\?\.'~] ? . 只是乱七八糟的,但这是一个真正的问题。它形成一个范围,从 / 以…结尾 _ 0-9 和大写字母 A-Z ,加

    , , ; , < = , > , ? , @ , [ \ , ] ^ , _

    …显然不是作者想要的。在regex中还有很多不必要的分组和重复代码,你真的需要匹配IP地址吗?寓意是:不要相信你在RegExLib.com上找到的任何东西。

        3
  •  0
  •   kalan    16 年前

    javascript中的正则表达式必须被斜杠“/”包围,因此看起来像

    var expr = /pattern/flags;
    

    var exp = /((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?/;
    

    如果使用构造器new RegExp(),请在窗体中调用它

    var expr = new RegExp(pattern [, flags]);
    

    这里的模式和标志是字符串参数

    var exp = new RegExp("((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?");