[英]Java string parsing with different regex to split
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;"
我對更改此字符串的創建格式沒有任何控制權。
我嘗試了這個,但是我無法真正獲得第一把鍵“ Tick for symbol”,“ timestamp_sec”等的值。
不僅在這個特定的字符串中,而且我很好奇如何解析具有多個正則表達式拆分的字符串。 任何幫助將不勝感激。
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]);
}
}
編輯
所需的輸出到地圖中:
(對符號打勾,.ISEQ-IDX)
(描述符ID,1)
(timestamp_sec,20130628030105)
(TIMESTAMP_USEC,384000)
(EXCH_TIME,1372388465384)
(SENDING_TIME,0)
(價格,3957.890000)
(MIC,XDUBIND)
接下來呢? 您可以指定鍵/值模式對的列表。 鍵直接指定為字符串,值指定為正則表達式。 然后,您可以通過該列表並在文本中搜索鍵,然后搜索值模式,如果找到它,則提取值。
我假設鍵可以以任何順序排列,不必全部都存在,可能會有多個空格隔開它們。 如果知道鍵的順序,則始終find
在上一個find
結束的地方開始find
。 如果您知道所有鍵都是必需的,那么如果找不到所需的鍵,則可以拋出異常。
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);
}
我認為正則表達式不會在這里為您提供幫助,無論誰設計輸出String的人顯然都沒有想到。
我建議簡單地通過一個循環解析String並手動完成整個操作。 或者,您可以只瀏覽String中的子字符串(以“ Tick for symbol”的形式吸吮),然后取其后的任何單詞(直到下一個空格),因為第二個參數似乎總是一個單詞。
使用java.util.regex包中的Pattern
類,在此java Regex教程中逐步介紹了該方法:
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.");
}
}
編輯 :使用group
而不是replaceAll
因為它更有意義,而且速度更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.