System.out.println("a.cgiadfasd.cgi?iii".replaceAll("\\.cgi(?:\\?)|\\.cgi$", ".jsp"));//结果a.cgiadfasd.jspiii
System.out.println("a.cgiadfasd.cgi".replaceAll("\\.cgi(?:\\?)|\\.cgi$", ".jsp"));//结果a.cgiadfasd.jsp但我第一句的期望是a.cgiadfasd.jsp?iii

解决方案 »

  1.   

    System.out.println("a.cgiadfasd.cgi?iii".replaceAll("\\.cgi(?:)|\\.cgi$", ".jsp"));//结果a.jspadfasd.jsp?iii
      

  2.   

    System.out.println("a.cgiadfasd.cgi?iii".replaceAll("\\.cgi(?:)|\\.cgi$", ".jsp"));//结果a.jspadfasd.jsp?iii
      

  3.   

    (?:expression) 是非捕获组,匹配的内容虽然不捕获到组中,但还是要计入最终的匹配结果的,你要的应该是顺序环视System.out.println("a.cgiadfasd.cgi?iii".replaceAll("\\.cgi(?=\\?)|\\.cgi$", ".jsp"));其实完全没必要搞那么烦,这样写就行了System.out.println("a.cgiadfasd.cgi?iii".replaceAll("\\.cgi(?=\\?|$)", ".jsp"));
      

  4.   

    实在不好意思,你输出的结果把第一个.cgi也给替换了,不是我想要的结果,但还是感谢你的参与另外能否解释一下只写(?:)的意思?好像我不太明白呢