A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 隋营营 中级黑马   /  2012-5-3 11:07  /  2481 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 隋营营 于 2012-5-9 07:31 编辑

正在研究正则表达式,碰到了一个让人恶心的问题:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Testext {
    public static void main(String[] args) {
        Pattern pn = Pattern.compile( ".{3}(?=a)" );
        Matcher mr = pn.matcher( "521a88b" );
        while (mr.find()) {
            System.out.println(mr.group());
        }
    }
}
输出:521 (我理解为:结尾的是a,不在3个字符内
将红色部分改为:"(?=a).{3}" 输出:a88 (我理解为:开头是a,在3个字符以内
将红色部分改为:"
(?!a).{3}" 输出:521 88b (我理解为:开头的不能是a
将红色部分改为:".{3}(?!a)" 输出:21a  88b(我理解为:结尾字符不能是a)

可是我将红色部分改为:".{3}(?<!a)" 或"(?<!a).{3}" 后却输出了:521  a88  实在是理解不了!
who can help me? 要崩溃了!

5 个回复

倒序浏览
以 (?) 开头的组是纯的非捕获组,非捕获组只匹配结果,但不捕获结果,也不会分配组号
例如:
(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内的内容。如:<div>hello</div>之中的hello,匹配结果不包括前缀<div>和后缀</div>。
-----------------------------------------------------------------------------------------------------------------------------------------------------
回复 使用道具 举报
姚鑫 发表于 2012-5-3 12:00
以 (?) 开头的组是纯的非捕获组,非捕获组只匹配结果,但不捕获结果,也不会分配组号
例如:
(? ...

:L更晕了,能不能结合我的例子说明?
回复 使用道具 举报
".{3}(?=a)" 的意思是捕获三个字符,这三个字符的后面要跟着a。
回复 使用道具 举报
姚鑫 发表于 2012-5-3 12:44
".{3}(?=a)" 的意思是捕获三个字符,这三个字符的后面要跟着a。

".{3}(?<!a)" 和 "(?<!a).{3}" 不理解,前4个我都可以自圆其说。
回复 使用道具 举报
好像人都进入10了!太冷清了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马