为javascript准备正则表达式

时间:2012-07-25 13:03:29

标签: javascript regex

我制作了这个正则表达式,当我在例如RegExr:

^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?!([a-z0-9]+\.)?(localhost|yahoo\.com))(.*)?

然而,当我在javascript中测试时,它表示表达式无效。经过几个小时的调试后,我发现这个表达式适用于javascript:

^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?![a-z0-9]+\.)?(localhost|yahoo\.com)(.*)?

然而,这不符合我的要求(再次在RegExr中进行测试)。

为什么我不能在javascript中使用第一个表达式?我该如何解决?

更新7月25日

抱歉缺少信息。我使用Regexp的方式是通过jQuery扩展,让我选择使用regexp。脚本可以在这里看到:http://james.padolsey.com/javascript/regex-selector-for-jquery/

我想要开始工作的具体代码是:

$('a:regex(href, ^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?!([a-z0-9]+\.)?(localhost|yahoo\.com))(.*)?)').live('click', function(e) {

包含链接的jQuery插件。我正在测试的文本字符串是:

它应该匹配“http://google.dk”,“http://test.yahoo.com”和“http://sub.yahoo.com/lalala” - 它在使用时所做的RegExr但使用jQuery插件失败(无效表达式)。

1 个答案:

答案 0 :(得分:3)

第一个正则表达式无效:

var regexp = /^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?!([a-z0-9]+\.)?(localhost|yahoo\.com))(.*)?/;

工作正常。

如果要从字符串中实例化表达式,则必须将所有反斜杠加倍:

var regexp = new RegExp("^https?:\\/\\/(www\\.)?(test\\.yahoo\\.com|sub\\.yahoo\\.com)?(?!([a-z0-9]+\\.)?(localhost|yahoo\\.com))(.*)?");

当你从字符串开始时,你必须考虑到字符串常量本身使用反斜杠作为引用机制的事实,因此将进行两个评估:一个作为字符串,并且一个作为正则表达式。

编辑 - 好的我觉得我看到了问题。考虑到Sizzle解析选择器的方式,你试图使用的插件只是试图做一些不会起作用的事情。换句话说,问题不在于你的正则表达式,而在于整个选择器。它甚至不足以解析正则表达式。

具体来说,似乎是正则表达式中的嵌套括号。像

这样简单的东西
$('a:regex(href, ((abc)))')

导致错误。你可以这样做:

$('a').filter(function() {
  return /^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?!([a-z0-9]+\.)?(localhost|yahoo\.com))(.*)?/.test(this.href);
}).whatever( ... );