正则表达式解释

时间:2009-11-01 13:58:46

标签: javascript regex bookmarklet

我正在查看tumblr bookmarklet中的代码,很好奇下面的代码是做什么的。

try{
    if(!/^(.*\.)?tumblr[^.]*$/.test(l.host))
        throw(0);
        tstbklt();
}

有人能告诉我if行是在测试吗?我试图解码正则表达式,但一直无法解决。

2 个答案:

答案 0 :(得分:5)

最初排除正则表达式的细节,此代码为:

if ( ! /.../.test(l.host) )

“如果不是regex.matches(l.host)”或“如果l.host与此正则表达式不匹配”​​

因此,正则表达式必须正确描述l.host文本的内容,以使条件失败,从而避免抛出错误。

关于正则表达式本身:

^(.*\.)?tumblr[^.]*$

这是检查tumblr是否存在但仅在可能存在的.结尾的任何字符串之后:

^       # start of line
(       # begin capturing group 1
.*      # match any (non-newline) character, as many times as possible, but zero allowed
\.      # match a literal .
)       # end capturing group 1
?       # make whole preceeding item optional
tumblr  # match literal text tumblr
[^.]*   # match any non . character, as many times as possible, but zero allowed
$       # match end of line


  

我认为这是测试主机是否是tumblr

是的,看起来似乎有意检查,但如果是这样的话,这是错误的做法。
为此,第一位应该类似于^(?:[\w-]+\.)?来捕获字母数字子域(?:是非捕获组,[\w-]+至少是1个字母数字,下划线或连字符)最后一位应该是\.(?:com|net|org)$或者像(?:\.[a-zA-Z]+)+$,取决于tld部分可能需要的灵活性。

答案 1 :(得分:1)

我试图将其分解。我不是正则表达式的专家:

<强> if(!/ ^(。)?tumblr [^。] 的$ /测试(l.host))

这部分不是真正的正则表达式,但告诉我们如果这个测试不起作用,只执行if()。

如果(!/的 ^(.*\.)?tumblr [^。] * $ /测试(l.host))

此部分允许在tumblr词之前的任何字符,只要它们后跟.但它都是可选的(请参见最后的?

如果(!/ ^(。*)。?tumblr ** [^.]*$/ **。试验(l.host))

接下来,它匹配除了之外的任何字符。然后*$扩展它以匹配任何字符(因此它不会在1之后中断)并且它一直有效直到字符串结束。

最后,.test()看起来针对当前主机名或l.host包含的内容进行测试(我不熟悉tumblr bookmarklet)

所以基本上,看起来该部分正在检查,如果主机不是tumblr的一部分,那么抛出该异常。

期待看到我有多错误:)