Java 因此,这个解决方案可能不是适合所有人的。如前所述,可能是为你:)当然,我不知道确切的规格。(顺便说一句,它不会单独搜索键,而是搜索键+空格+值模式)。它很容易根据精确的规格进行修改。如果键的顺序是固定的,并且所有键都是必须的,那么也可以匹配一个大的模式。我
Java 因此,这个解决方案可能不是适合所有人的。如前所述,可能是为你:)当然,我不知道确切的规格。(顺便说一句,它不会单独搜索键,而是搜索键+空格+值模式)。它很容易根据精确的规格进行修改。如果键的顺序是固定的,并且所有键都是必须的,那么也可以匹配一个大的模式。我,java,string,parsing,Java,String,Parsing,因此,这个解决方案可能不是适合所有人的。如前所述,可能是为你:)当然,我不知道确切的规格。(顺便说一句,它不会单独搜索键,而是搜索键+空格+值模式)。它很容易根据精确的规格进行修改。如果键的顺序是固定的,并且所有键都是必须的,那么也可以匹配一个大的模式。我试图通过str.indexOf(str,fromIndex)来实现这一点,但这看起来比你给我的复杂。是的,这个解决方案看起来不错。我用了类似的方法,但没有列表,我只是使用了模式。:)请注意,这可能已经足够好了,但由于尚未指定值,因此可能是在值中
因此,这个解决方案可能不是适合所有人的。如前所述,可能是为你:)当然,我不知道确切的规格。(顺便说一句,它不会单独搜索键,而是搜索键+空格+值模式)。它很容易根据精确的规格进行修改。如果键的顺序是固定的,并且所有键都是必须的,那么也可以匹配一个大的模式。我试图通过str.indexOf(str,fromIndex)来实现这一点,但这看起来比你给我的复杂。是的,这个解决方案看起来不错。我用了类似的方法,但没有列表,我只是使用了模式。:)请注意,这可能已经足够好了,但由于尚未指定值,因此可能是在值中找到了键。双键也可能是一个问题。因此,这个解决方案可能不是适合所有人的。如前所述,可能是为你:)当然,我不知道确切的规格。(顺便说一句,它不会单独搜索键,而是搜索键+空格+值模式)。它很容易根据精确的规格进行修改。如果键的顺序是固定的,并且所有键都是必须的,那么也可以匹配一个大模式。为什么要使用
m.replaceAll
?m.group(i)
还不够吗?我想坏习惯现在会改变的。在我的测试中,使用group使代码的运行速度比使用replaceAll快5-10倍为什么使用m.replaceAll
?m.group(i)
还不够吗?我想坏习惯现在会改变的。在我的测试中,使用group使代码运行速度比使用replaceAll快5-10倍
str="Tick for symbol .ISEQ-IDX descriptor id 1 timestamp_sec 20130628030105 timestamp_usec 384000;EXCH_TIME 1372388465384;SENDING_TIME 0;PRICE 3957.890000;MIC XDUBIND;"
String[] s = line.split(";");
Map<String, String> m = new HashMap<String, String>();
for (int i = 0; i < s.length; i++)
{
String[] split = s[i].split("\\s+");
for (String string2 : split)
{
//Adding key value pair. to a map for further usage.
m.put(split[0], split[1]);
}
}
static String test="Tick for symbol .ISEQ-IDX descriptor id 1 timestamp_sec 20130628030105 timestamp_usec 384000;EXCH_TIME 1372388465384;SENDING_TIME 0;PRICE 3957.890000;MIC XDUBIND;";
static List<String> patterns = Arrays.asList(
"Tick for symbol", "\\S+",
"descriptor id", "\\d+",
"timestamp_sec", "\\d+",
"timestamp_usec", "\\d+",
"EXCH_TIME", "\\d+",
"SENDING_TIME","\\d+",
"PRICE", "\\d+.\\d",
"MIC", "\\S+"
);
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
for (int i = 0; i<patterns.size();i+=2) {
String key = patterns.get(i);
String val = patterns.get(i+1);
String pattern = "\\Q" +key + "\\E\\s+(" + val + ")";
Matcher m = Pattern.compile(pattern).matcher(test);
if (m.find()) {
map.put(key, m.group(1));
}
}
System.out.println(map);
}
private static final Pattern splitPattern = Pattern.compile("^Tick for symbol (.*) descriptor id (\\d+) timestamp_sec (\\d+) timestamp_usec (\\d+);EXCH_TIME (\\d+);SENDING_TIME ?(\\d+);PRICE (.*);MIC (\\w+);$");
private static String printExtracted(final String str) {
final Matcher m = splitPattern.matcher(str);
if (m.matches()) {
final String tickForSymbol = m.group(1);
final long descriptorId = Long.parseLong(m.group(2), 10);
final long timestampSec = Long.parseLong(m.group(3), 10);
final long timestampUsec = Long.parseLong(m.group(4), 10);
final long exchTime = Long.parseLong(m.group(5), 10);
final long sendingTime = Long.parseLong(m.group(6), 10);
final double price = Double.parseDouble(m.group(7));
final String mic = m.group(8);
return "(Tick for Symbol, " + tickForSymbol + ")\n" +
"(descriptor id, " + descriptorId + ")\n" +
"(timestamp_sec, " + timestampSec + ")\n" +
"(timestamp_usec, " + timestampUsec + ")\n" +
"(EXCH_TIME, " + exchTime + ")\n" +
"(SENDING_TIME, " + sendingTime +")\n" +
"(PRICE, " + price + ")\n" +
"(MIC, " + mic + ")";
} else {
throw new IllegalArgumentException("Argument " + str + " doesn't match pattern.");
}
}