java中正则表达式中的非字符串处置

java中正则表达式中的非字符串处理

在java中我们经常遇到这样的情况,

如下:

<img src="image0"></img>ss<img src="image1"></img>pp<img alt="say"></img>

我们想获取img中的信息,但是alt又不是我们需要的,我们需要获得的只是src的内容。也许你会说我提取两次就好了,确实提取两次就可以了。

但是有的时候是不允许提取两次的。。

所以这里我们就用到了非,

我们举一个例子


String str="aaatggcccssaaakkcccaaaxvcccaaavxccc";

我们想提取aaa和ccc之间的内容,但是我们提取的这里面不希望是xx开头的。。应该怎么做呢。

我们都知道,正则中的非是^

很显然,

regex="aaa[^xx]ccc";这样的方法肯定是不行的。。

也许你会想到

regex="aaa[^x][^x]ccc";

但是实际上这种方法也是不行的。。。因为在正则判断的时候,如果发现第一个字母x不符合[^x]的条件,那么就直接是判断false的。


php语言中有?!非字符串   的用法,但是java中貌似没有,至少我暂时还没发现,如果有希望大家告诉我一下。。

对于上面的问题,其实我们可以换个角度去想想,如果不允许xx的形式,其实反过来就是允许

x[^x]|[^x][^x]|[^x]x的形式。所以我们的思路来了。。

例子如下:

String regex="aaa(x[^x]\\w*?|[^x][^x]\\w*?|[^x]x\\w*?)ccc";
        String str="aaatggcccssaaakkcccaaaxvcccaaaxxccc";
        Matcher m = Pattern.compile(regex).matcher(str);
        while(m.find()){
            System.out.println(m.group(1));
        }

显示结果如下:

tgg
kk
xv

结果正确,测试了好几种方法,暂时还没发现错误。。如果大家有更好的方法,欢迎分享。

最后补充一下,这样的方式去提取是很低效的,如果可以,如果不是想偷懒的话,还是分两次提取的方法更合适一些。