黑马程序员技术交流社区

标题: 我被这个正则表达式弄晕了! [打印本页]

作者: 隋营营    时间: 2012-5-3 11:07
标题: 我被这个正则表达式弄晕了!
本帖最后由 隋营营 于 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? 要崩溃了!


作者: 姚鑫    时间: 2012-5-3 12:00
以 (?) 开头的组是纯的非捕获组,非捕获组只匹配结果,但不捕获结果,也不会分配组号
例如:
(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内的内容。如:<div>hello</div>之中的hello,匹配结果不包括前缀<div>和后缀</div>。
-----------------------------------------------------------------------------------------------------------------------------------------------------

作者: 隋营营    时间: 2012-5-3 12:07
姚鑫 发表于 2012-5-3 12:00
以 (?) 开头的组是纯的非捕获组,非捕获组只匹配结果,但不捕获结果,也不会分配组号
例如:
(? ...

:L更晕了,能不能结合我的例子说明?
作者: 姚鑫    时间: 2012-5-3 12:44
".{3}(?=a)" 的意思是捕获三个字符,这三个字符的后面要跟着a。

作者: 隋营营    时间: 2012-5-3 12:58
姚鑫 发表于 2012-5-3 12:44
".{3}(?=a)" 的意思是捕获三个字符,这三个字符的后面要跟着a。

".{3}(?<!a)" 和 "(?<!a).{3}" 不理解,前4个我都可以自圆其说。
作者: 隋营营    时间: 2012-5-3 14:00
好像人都进入10了!太冷清了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2