JavaScript拒绝我所有的RegEx,怎么回事?

时间:2010-07-13 08:43:00

标签: javascript regex

我现在有这个,(我在这里找到了代码)。

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

它将使用适当的<a href>

替换someText中的任何http://URL

但我也要求它匹配www。没有http。我在RegEx Lib上找到了这个RegEx。

((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检查站点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 个答案:

答案 0 :(得分:6)

我相信RegExp构造函数将字符串作为参数,请参见此处:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/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>");

答案 1 :(得分:2)

好的,你已经理顺了JavaScript语法,现在让我们谈谈 regex 语法。冒号(:)没有特殊含义,所以没有必要逃避它。点(.)和问号(?)通常具有特殊含义,但不会出现在字符类中(即方括号内)。

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

现在看看[a-zA-Z0-9%:/-_\?\.'~]?.前面的反斜杠只是杂乱无章,但是foruth连字符是一个真正的问题。它形成一个以/开头并以_结尾的范围;如果您查看ASCII字符映射,您会看到它包含数字0-9和大写字母A-Z,以及

/:;<=>?@[\]^_

......显然不是作者的意图。在该正则表达式中还有许多不必要的分组和重复代码,您是否真的需要匹配IP地址?道德是:不要相信你在RegExLib.com上找到的任何东西。

答案 2 :(得分:0)

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%:/-_\?\.'~]*)?");