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]+忽略掉了。但把他们前后位置调换一下又可以了。这也是跟懒惰匹配有关吗?
接近 2 年之前 回复
Marksinoberg
Marksinoberg   Ds   Rxr 2016.09.22 13:47

简单通俗的的来说:

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

 这两个的起点不一样。
z5593091
z5593091 这个我知道,但是为什么换成[a]*|[b]+之后,会只匹配a,不匹配b。“|”不是或符号吗,无论[a]*怎么匹配,[b]+总不应该被省略掉吧
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java疑问收集
java疑问收集java疑问收集java疑问收集java疑问收集java疑问收集java疑问收集java疑问收集java疑问收集java疑问收集java疑问收集java疑问收集java疑问收集
正则表达式在JAVA中应用
正则表达式在Ext中,要加/^ $/,比如/^[0-9]{1,9}$/ 正则表达式在JAVA中应用 正则表达式在JAVA中应用 正则表达式在JAVA中应用 正则表达式在JAVA中应用
正则表达式语法
帮你解决所有有关正则表达式的疑问,aaaa
Java中为什么long能自动转换成float类型
刷题时候看到一个float和long相互转换的问题,float向long转换的时候不会报错,一个4个字节一个8个字节,通过baidu找到了答案。 下面转载自http://blog.csdn.net/shanshan1yi/article/details/48477119 /****************************************************分割线******
java正则表达式应用
正则表达式,解析了java中的正则表达式。好资源分享下。
关于java中的\和正则表达式中的\
根据实际的测试和理解,在java字符串中\本来就表示转义字符,它会试图将后面挨着它的任何字符转义,如果转义无指定含义则非法,不能通过编译,比如\.所以在和正则无关的字符串中要表示路径中的分隔符都得用\\ 所以要表示正则中特殊含义的\d,要用\先把\转义回来,再加上d,这样就是\\d,所以java的正则表达式中\基本都是成对出现的,因为它在java意义上的字符串中。这可能和php不同,因为
Java - Java中是如何支持正则表达式操作的?
Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作,请参考下面题目的代码。- 如果要从字符串中截取第一个英文左括号之前的字符串,例如:北京市(朝阳区)(西城区)(海淀区),截取结果为:北京市,那...
Java中正则表达式使用方法详解
Java中正则表达式使用方法详解.docx 网上搜集的Java中正则表达式使用方法详解
java使用正则表达式。
java中,使用正则表达式匹配。 正则表达式的说明和在java中的使用在其中都有。
关于BufferedInputStream和FileInputStream中Read方法的问题
BufferedInputStream的实现中有一个用于存储数据的内部缓冲区数组:protected volatile byte[] buf。这个缓冲区数组的作用在于对源进行数据块访问,而不是一字节一字节的访问,也就是进行一次I/O将一块数据存到缓冲区中,再从缓冲区中read,当缓冲区为空时再重新读新的数据块。这个数组是jdk里的BufferedInputStream类的实现里的,是作为Buffe