有大约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@...(后面雷同)的长串请问怎么样提取短串效率最高,请大家各抒己见,谢谢!
拼接成 23756563&3000343&truetrue@...(后面雷同)的长串请问怎么样提取短串效率最高,请大家各抒己见,谢谢!
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)+"@");
}}
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));
}
估计效率不高~
matcher.group(2) + "&" + matcher.group(3)+"@");
改为
matcher.group(2) + matcher.group(3)+"@");不好意思
如果是文件的话,建议分多台机器分别处理一下部分,手动合成一个文件最好!注意:一定要把所有字符串都在内存拼接好了以后再统一输出到文件,用StringBuffer!
是有规律,但固定位置截取恐怕不行,因为某些字段属性的长度还是可能变化的,比如 odds="3.1" 和 odds="3.25" 占用的位数不同,就会影响到后面的截取
需要知道 "23756583&3000343&truetrue@" 有没有在长串中出现过,有没有比 StringBuilder.indexOf()更有效率的方法?
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"));
}
应该没有更好的方法了 用正则确实效率比较低