有大约10000000(一千万)个类似这样的长字符串CREATED BettingOffer[448359642]{odds="2.12",oddsStatusId="1",oddsChangedDate="2007-11-19 00:00:00.458",outcomeId="23756563",isBack="true",isSingle="true",isLive="false",volume=null,volumeCurrencyId=null,couponKey=null,providerId="3000343"}现在需要提取出其中的4个属性,如outcomeId的23756563、isBack的true、isSingle的true、providerId的3000343,组成短串后,
拼接成 23756563&3000343&truetrue@...(后面雷同)的长串请问怎么样提取短串效率最高,请大家各抒己见,谢谢!

解决方案 »

  1.   

    使用正则表达式import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class TestRegex3 { public static void main(String[] args) {
    String str = "CREATED   BettingOffer[448359642]{odds=\"2.12\","
    + "oddsStatusId=\"1\",oddsChangedDate=\"2007-11-19   00:00:00.458\","
    + "outcomeId=\"23756563\",isBack=\"true\",isSingle=\"true\","
    + "isLive=\"false\",volume=null,volumeCurrencyId=null,"
    + "couponKey=null,providerId=\"3000343\"} ";
    String regex = "\\{.*outcomeId=\"(\\d+)\".*isBack=\"(true|false)\".*isSingle=\"(true|false)\".*providerId=\"(\\d+)\"\\}";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    if(matcher.find())
    System.out.println(matcher.group(1) + "&" + matcher.group(4)
    + "&" + matcher.group(2) + "&" + matcher.group(3)+"@");
    }}
      

  2.   

    String str = "a='1',b='2',c='3',d='4'";
    str.replace("='","");
    str.replace("',","/");这是str变成 "a1/b2/c3/d4"String st[] = str.split("/");for(int i=0;i<st.length;i++){
        搜索吧~
        System.out.println(str.substring(str.indexOf('a')+1));
        System.out.println(str.substring(str.indexOf('b')+1));
        System.out.println(str.substring(str.indexOf('c')+1));
    }
    估计效率不高~
      

  3.   

    好像最后个该删去“&”
    matcher.group(2) + "&" + matcher.group(3)+"@");
    改为
    matcher.group(2) + matcher.group(3)+"@");不好意思
      

  4.   

    如果要提高效率的话,个人感觉还是不要用正则表达式。虽然它的却很好用,但那是牺牲了效率换取通用性的做法。LZ你的字符串是不是都像上述字符串那样有规律?我想应该是的。这样的话,你可以利用字符串的位置固定特性搜索,会很快。而且正确、好写代码。IO操作效率惠降低很多很多,如果仅在内存中操作就不会慢了。就用搜索字符串位置、截取字符串、拼接字符串的方法。由于此类工作划分极其容易,截串可以考虑多机器并行(如果数据量在夸张些)。你要把那么大的结果字符串放在哪?
    如果是文件的话,建议分多台机器分别处理一下部分,手动合成一个文件最好!注意:一定要把所有字符串都在内存拼接好了以后再统一输出到文件,用StringBuffer!
      

  5.   

    我建议不要用java,如果是unix/linux环境,使用Awk
      

  6.   

    to: AndyJee
    是有规律,但固定位置截取恐怕不行,因为某些字段属性的长度还是可能变化的,比如 odds="3.1" 和 odds="3.25" 占用的位数不同,就会影响到后面的截取
      

  7.   

    to: Clesome_VC假设我现在拼接出了像23756563&3000343&truetrue@23756564&3000343&truetrue@23756563&3000343&truefalse@....(500万个短串)这样的长串,保存在StringBuilder中。
    需要知道 "23756583&3000343&truetrue@" 有没有在长串中出现过,有没有比 StringBuilder.indexOf()更有效率的方法?
      

  8.   

    public static void main(String[] args) {
    String   str   =   "a= '1 ',b= '2 ',c= '3 ',d= '4 ' "; str.replace( "= ' ", "/");
    str.replace( " ', ", "/ "); //这时str变成了 "a/1/b/2/c/3/d/4 " String st[]   =   str.split( "/ ");
    Map<String,String> map = new HashMap<String,String>(); for(int   i=0;i <st.length;i++){
    map.put(st[i], st[i+1]);
    }

    //这时你想要什么 直接去map拿就OK了啊~~
    System.out.println(map.get("a"));
            System.out.println(map.get("b"));
            System.out.println(map.get("c"));
    }
      

  9.   

    to: luffyday这样是能做出来,但恐怕太慢了 :)
      

  10.   

    ding不推荐用正则表达式,这样太慢。如果outcomeId这样的关键字相对还比较固定的话,建议substring()方法找找。
      

  11.   

    re LZ
    应该没有更好的方法了  用正则确实效率比较低