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+
    
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器