JAVA,正则表达式中*和+的疑问

@Test
public void test(){
String str="aabbaabb";
Pattern pat=Pattern.compile("[a]+|[b]+");
Matcher matcher=pat.matcher(str);
String newStr=matcher.replaceAll("");
System.out.println(newStr);
}
如上示例代码,正则表达式为“[b]+|[a]+”,很明显,在执行完之后,字符串中的a和b都会被替换成空字符串。
而当我把正则表达式改为Pattern pat=Pattern.compile("[a]*|[b]+");
之后执行,发现就只有a被替换成空字符,而b则不变,输出如下:bbbb

然后再当我将正则表达式改为“[a]+|[b]*”之后,执行,就a和b都变成空字符了,就等效于“[b]+|[a]+”了。到底为什么会这样子呢?小弟愚笨,没想通,还请各位指教一下。
很奇怪为什么即使有“|”符在,它也把[b]+忽略掉了。但把他们前后位置调换一下又可以了。

 这个涉及到正则表达式引擎选择贪婪匹配还是懒惰匹配的策略问题。
比如a*b+,既可以匹配aabb,也可以匹配到abb,也可以匹配到bb,
http://www.cnblogs.com/xudong-bupt/p/3586889.html

如果你要用a*b+,可以这么写  (?<!a)a*b+

简单通俗的的来说:

 *    代表0个或者多个
 +    代表1个或多个。

 这两个的起点不一样。