这是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这样的网址应该通过。
答案 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/是更多信息的好参考