正则表达式:如何消除以.dtd结尾的网址

时间:2010-03-31 12:45:27

标签: regex

这是JavaScript正则表达式。

regex = /(http:\/\/[^\s]*)/g;

text = "I have http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd and I like http://google.com a lot";

matches = text.match(regex);

console.log(matches);

我在结果中得到了两个网址。但是我想删除所有以.dtd结尾的url。我该怎么做?

请注意,我说应该删除以.dtd结尾。这意味着像http://a.dtd.google.com这样的网址应该通过。

1 个答案:

答案 0 :(得分:3)

最好的方法是使用负面的lookbehind(支持它们的语言):

/(?>http:\/\/[^\s]*)(?<!\.dtd)/g

第一个括号中的?>使其成为一个原子分组,可以阻止正则表达式引擎回溯 - 所以它会像现在一样匹配完整的URL,如果/当下一个部分失败时它不会尝试返回并匹配较少。

(<!\.dtd)是一个负面的后瞻,仅当\.dtd 匹配在该位置结束时才匹配(即,该URL不以{{结尾) 1}})。

对于那些没有的语言(例如JavaScript),你可以做一个负面的前瞻,这有点难看,通常效率较低:

.dtd

将匹配/(http:\/\/(?![^\s]*\.dtd\b)[^\s]*)/g ,然后向前扫描以确保它不会在http://中结束,然后回溯并再次向前扫描以获得实际匹配。

与往常一样,http://www.regular-expressions.info/是更多信息的好参考