z5593091 2016-09-22 03:39 采纳率: 0%
浏览 905

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条回答

  • threenewbee 2016-09-22 03:46
    关注
     这个涉及到正则表达式引擎选择贪婪匹配还是懒惰匹配的策略问题。
    比如a*b+,既可以匹配aabb,也可以匹配到abb,也可以匹配到bb,
    http://www.cnblogs.com/xudong-bupt/p/3586889.html
    
    如果你要用a*b+,可以这么写  (?<!a)a*b+
    
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!