正则表达式只在捕获之前与两个相似的URL非常具体匹配

时间:2012-09-25 14:03:49

标签: java regex regex-lookarounds

因此,我试图仅使用随之捕获的图像扩展名来提取某些图像的名称。唯一的问题是,有两种非常相似的形式和两种形式,只有图像网址的显示方式。

第一个网址是这样的

http://www.trollface.com/dolan/images/IMGnameEYEwant.jpg

唯一的问题是偶尔也会以这种方式显示图像:

http://www.trollface.com/dolan/images/small/IMGnameEYEwant.jpg

现在我知道这不是优雅的,但是我必须使用这样的东西:

trollface\.com/dolan/images/(.*?)">

由于两个网址的相似程度

,到目前为止一直很好

另一个问题是我需要解决方案是纯正则表达式。没有java,php,javascript什么都没有。甚至试图让它真的尝试每个字母组合之前这样,我知道这是非常糟糕的方法,但我是一个正则表达式noob:

[ao][gr]e[s/][/i][pm][ra][og][de][us][c/][tp][/r][so][md][au][lc][lt]/(.*?)">

唯一的问题是它总会首先找到第一个URL,因为它们有多么相似,并且也总是捕获我不需要的URL的small/部分。

我该怎么做?我当时想的可能是前瞻或后视,但我没有足够的经验让这些工作。

编辑:核心是基于Java的,但在目前的情况下,我无法使用Java来解决这个问题:(

2 个答案:

答案 0 :(得分:2)

#http://www.trollface.com/dolan/images/(?:small/)?([^/\#]+)#

在文字匹配之后对正则表达式的解释:

(?: ... )

非捕获组。含义"匹配此,但不要将其传回。"

... ?

使上一组可选。

(  ... )

捕获组

[^/\#]+

任何不是正斜杠或散列标记的字符,一次或多次。你可能不需要在Java中逃避这一点。

答案 1 :(得分:0)

var test1="http://www.trollface.com/dolan/images/IMGnameEYEwant.jpg";
var test2="http://www.trollface.com/dolan/images/small/IMGnameEYEwant.jpg";
var test3="http://google.com/";

var rx = /(http:\/\/www\.trollface\.com\/dolan\/images\/)(?:small)?(.+)/i;

var m = test1.match(rx);
if(m.length == 3) {
    alert(m[1]);
    alert(m[2]);
}
var m = test2.match(rx);
if(m.length == 3) {
    alert(m[1]);
    alert(m[2]);
}
var m = test3.match(rx);
if(m.length == 3) {
    alert(m[1]);
    alert(m[2]);
}