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

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

如下:

image0ssimage1pp

我们想获取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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值