我有一个包含结构化数据的文件,但它可能有一个缺少的字段,如下所示
Name:xxxxx,Age:20,Gender:Male
Name:yyyy,Gender:male
Name:zzzx,Age:26,Gender:Male
我想要一个正则表达式来获取姓名,年龄和性别的值。到目前为止,我已经使用了
Name:(.*),Age:(.*),Gender:(.*)
如果所有三个字段都存在,则会带来值,但它对丢失的文件不起作用。任何人都可以告诉我如何实现这个
答案 0 :(得分:1)
您使用的是Java的Pattern和Matcher类吗?如果是这样,你可以像这样做一个正则表达式。
(Name:(.*),)?(Age:(.*),)?(Gender:(.*),)?
这会弄乱你的分组,但应该给出正确的结果。这有效的原因是因为当你使用'?'时它找到它所寻找的零个或一个实例。所以这对你正在做的事情来说是完美的。
答案 1 :(得分:1)
在,
和:
上拆分以获取所有键值对。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SOPlayground {
public static void main(String[] args) throws Exception {
String input = "Name:xxxxx,Age:20,Gender:Male\n"
+ "Name:yyyy,Gender:male\n"
+ "Name:zzzx,Age:26,Gender:Male";
List<Map<String, String>> entries = new ArrayList<>();
for (String line : input.split("\n")) {
Map<String, String> entry = new HashMap<>();
for (String field : line.split(",")) {
String[] parts = field.split(":");
String key = parts[0];
String value = parts[1];
entry.put(key, value);
}
entries.add(entry);
}
System.out.println(entries);
}
}
输出:
[{Gender=Male, Age=20, Name=xxxxx}, {Gender=male, Name=yyyy}, {Gender=Male, Age=26, Name=zzzx}]
答案 2 :(得分:1)
试试类似:
String str = "Name:xxxxx,Age:20,Gender:Male";
String regex = "Name:(.*?[^,]),Age:(.*?[^,]),Gender:(.*)";
...
Output:
xxxxx
20
Male