![](/img/trans.png)
[英]Parsing a string into a list by column to mimic a table in Java, using regex
[英]Parsing a table using regex - Java
我正在解析以下AWS
成本實例表:
m1.small 1 1 1.7 1 x 160 $0.044 per Hour
m1.medium 1 2 3.75 1 x 410 $0.087 per Hour
m1.large 2 4 7.5 2 x 420 $0.175 per Hour
m1.xlarge 4 8 15 4 x 420 $0.35 per Hour
有一個包含這些費用的文件:
input = new Scanner(file);
String[] values;
while (input.hasNextLine()) {
String line = input.nextLine();
values = line.split("\\s+"); // <-- not what I want...
for (String v : values)
System.out.println(v);
}
然而,這給了我:
m1.small
1
1
1.7
1
x
160
$0.044
per
Hour
這不是我想要的...更正的解析values
(使用正確的正則表達式)將如下所示:
['m1.small', '1', '1', '1.7', '1 x 160', '$0.044', 'per Hour']
為了獲得正確的結果,正確的regex
是什么? 可以假設該表將始終具有相同的模式。
試試這個小提琴https://regex101.com/r/sP6zW5/1
([^\\s]+)\\s+(\\d+)\\s+(\\d+)\\s+([\\d\\.]+)\\s+(\\d+ x \\d+)\\s+(\\$\\d+\\.\\d+)\\s+(per \\w+)
匹配文本,組是您的列表。
我認為在你的情況下使用拆分太復雜了。 如果文本總是相同的。就像字符串格式的反向過程。
如果你想使用正則表達式,你可以這樣做:
String s = "m1.small 1 1 1.7 1 x 160 $0.044 per Hour";
String spaces = "\\s+";
String type = "(.*?)";
String intNumber = "(\\d+)";
String doubleNumber = "([0-9.]+)";
String dollarNumber = "([$0-9.]+)";
String aXb = "(\\d+ x \\d+)";
String rest = "(.*)";
Pattern pattern = Pattern.compile(type + spaces + intNumber + spaces + intNumber + spaces + doubleNumber
+ spaces + aXb + spaces + dollarNumber + spaces + rest);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
String[] fields = new String[] { matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(4),
matcher.group(5), matcher.group(6), matcher.group(7) };
System.out.println(Arrays.toString(fields));
}
請注意我是如何將正則表達式分解為可讀的。 (作為一個長字符串,它很難讀/維。)還有另一種方法可以做到這一點。 由於您知道哪些字段正在拆分,因此您可以執行此簡單拆分並使用組合值構建新數組:
String[] allFields = s.split("\\s+");
String[] result = new String[] {
allFields[0],
allFields[1],
allFields[2],
allFields[3],
allFields[4] + " " + allFields[5] + " " + allFields[6],
allFields[7],
allFields[8] + " " + allFields[9] };
System.out.println(Arrays.toString(result));
分開一個更多的空間。 空格必須出現在下面的上下文中。
數字 - 空間 - 不是“x”
要么
不是“x” - 空間 - 數字
values = line.split("(?<=\\d)\\s+(?=[^x])|(?<=[^x])\\s+(?=\\d)")));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.