我正在解析以下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
是什么?可以假设该表将始终具有相同的模式。
答案 0 :(得分:5)
试试这个小提琴 https://regex101.com/r/sP6zW5/1
([^\s]+)\s+(\d+)\s+(\d+)\s+([\d\.]+)\s+(\d+ x \d+)\s+(\$\d+\.\d+)\s+(per \w+)
匹配文字,该组就是您的清单。
我认为在你的情况下使用拆分太复杂了。如果文本总是相同的。就像字符串格式化的反向过程。
答案 1 :(得分:5)
如果你想使用正则表达式,你可以这样做:
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));
答案 2 :(得分:4)
再分开一个空格。空格必须出现在下面的上下文中。
数字 - 空间 - 不是“x”
或
NOT“x” - SPACES - DIGIT
#include<stdio.h>
void clearstdin(void) {
int c;
while ((c = fgetc(stdin)) != EOF && c != '\n');
}
int main() {
int n, i = 0;
char val;
char a[20];
printf("\nEnter the value : ");
scanf("%s",a);
clearstdin();
printf("\nEnter the value to be searched : ");
scanf("%c", &val);
int count = 0;
for (i = 0; i < 20; i++) {
if (a[i] == val) {
printf("\n%c found at location %d", val, i);
count++;
}
}
printf("\nTotal occurance of %c is %d", val, count);
return 0;
}