2 z5593091 z5593091 于 2016.09.22 11:39 提问

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]+忽略掉了。但把他们前后位置调换一下又可以了。

2个回答

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

如果你要用a*b+,可以这么写  (?<!a)a*b+
z5593091
z5593091 我有个地方表述错误了:当把正则表达式改为Pattern pat=Pattern.compile("[a]*|[b]+"); 之后执行,是只有a被替换成空字符,而b则不变,输出如下:bbbb,所以很奇怪为什么即使有“|”符在,它也把[b]+忽略掉了。但把他们前后位置调换一下又可以了。这也是跟懒惰匹配有关吗?
大约一年之前 回复
Marksinoberg
Marksinoberg   Ds   Rxr 2016.09.22 13:47

简单通俗的的来说:

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

 这两个的起点不一样。
z5593091
z5593091 这个我知道,但是为什么换成[a]*|[b]+之后,会只匹配a,不匹配b。“|”不是或符号吗,无论[a]*怎么匹配,[b]+总不应该被省略掉吧
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片