当前位置:编程学习 > 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
 
结果正确,测试了好几种方法,暂时还没发现错误。。如果大家有更好的方法,欢迎分享。
最后补充一下,这样的方式去提取是很低效的,如果可以,如果不是想偷懒的话,还是分两次提取的方法更合适一些。
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,