形如这样的字符串:Patch_20130102_行业版_1_0010 怎么定位到倒数第二个“_”,并截取倒数第二个“_”前面的字符串。
现在是这么实现的,不知道还有没有简单的方法,求助呀....String ss = "Patch_20130102_行业版_1_0010";
String tmp = ss.substring(0,ss.lastIndexOf("_"));
tmp = tmp.substring(0,tmp.lastIndexOf("_"));
System.out.println(tmp);

解决方案 »

  1.   

    你这个代码不算太复杂,
    用正则:
    String ss = "Patch_20130102_行业版_1_0010";
    String tmp = ss.replaceAll("(.*)_.*?_.*?", "$1");
      

  2.   

    这种每段拼接的数据,直接用split "_"得到一个数组[Patch, 20130102, 行业版, 1, 0010]。这个单独的数据都有了,后面要用的话直接拼接,拓展性好点。String[] str = "Patch_20130102_行业版_1_0010".split("_");
      

  3.   

    请问第二个参数$1的含义是什么呀?而且这个表达式并不能产生我想要的字符串:Patch_20130102_行业版,而是生成:Patch_20130102_行业版0010
      

  4.   


    String ss = "Patch_20130102_行业版_1_0010"; 
    String tmp = ss.replaceAll("((.*)+)_((.*)?)_((.*)?)", "$1");
    System.out.println(tmp);
      

  5.   

    观察楼主的字符串:Patch_20130102_行业版_1_0010
    我觉得这个基本是一个业务指定的名称,不会有太大的变化性,用下划线去判断反而有点浪费。这个字符串每次会改变的都是年份和后面的版本号,前面14位的长度是不会改变的,可以直接用substring(0,14)就可以了。如果这个名称经常改动,一定要用最后第二个下划线来判断的话,建议还是用你自己的那个方法,正则表达式虽然效率高好用,但是可读性比较差,对于经常需要更改的需求,反而加大维护项目的成本。
      

  6.   

    观察楼主的字符串:Patch_20130102_行业版_1_0010
    我觉得这个基本是一个业务指定的名称,不会有太大的变化性,用下划线去判断反而有点浪费。这个字符串每次会改变的都是年份和后面的版本号,前面14位的长度是不会改变的,可以直接用substring(0,14)就可以了。如果这个名称经常改动,一定要用最后第二个下划线来判断的话,建议还是用你自己的那个方法,正则表达式虽然效率高好用,但是可读性比较差,对于经常需要更改的需求,反而加大维护项目的成本。
      

  7.   

    刚开始我想复杂了其实只要
    String tmp = ss.replaceAll("(.*)_(.*?)_(.*)", "$1");就可以了
      

  8.   

    方法超多
    第一种:用split("_")得到的String数组,将数组length-3的元素用_连接成一个String,这是最直接的方式。
    第二种:用lastIndexOf("_")找到最后一个_的位置,然后substring,得到的心字符串,再调用一次开始的过程,就可以了。
    第三种:正则
    .......很多种方法都能实现的。