如何使用Java8或regex通过多个分隔符解析字符串



我有一个这样的List<String>:

List.of(
"ParamField(paramName=Thomas, paramValue=Admitted)",
"ParamField(paramName=Martin, paramValue=Discarded)",
"ParamField(paramName=Steve, paramValue=Admitted)"
);

我如何迭代列表并解析所有字符串,以便在迭代结束时我可以得到一个包含如下内容的字符串

String s = "Thomas-Admitted;Marting-Discarded;Steve-Admitted";

使用

的简单子字符串和索引
ArrayList list=new ArrayList();
List.of(
"ParamField(paramName=Thomas, paramValue=Admitted)",
"ParamField(paramName=Martin, paramValue=Discarded)",
"ParamField(paramName=Steve, paramValue=Admitted)"
).forEach(item->{
list.add(item.substring(21,item.lastIndexOf(","))+"-"+item.substring(item.lastIndexOf("ue=")+3,item.lastIndexOf(")")));
});
String s =list.toString();

Regex

使用正则表达式捕获组很容易实现这一点。您的模式将是"ParamField\(paramName=(.+), paramValue=(.+)\)",然后您只需匹配并得到group(1)group(2)

一旦您提取了它,只需在;或类似的StringJoiner上创建字符串。

可以像这样:

Pattern pattern = Pattern.compile("ParamField\(paramName=(.+), paramValue=(.+)\)");
StringJoiner sj = new StringJoiner(";");
for (String paramField : paramFields) {
Matcher matcher = pattern.matcher(paramField);
if (!matcher.find()) {
throw new IllegalArgumentException("Bad input format");
}
String name = matcher.group(1);
String value = matcher.group(2);
sj.add(name + "-" + value);
}
String result = sj.toString();
与OOP

理想情况下,您可以使用一些OOP,并在该字符串上使用工厂方法创建一个不错的记录ParamField,然后使用它的getter。如果你需要做更多的事情,这样更容易继续处理数据。

record ParamField(String name, String value) {
private static Pattern pattern = Pattern.compile(
"ParamField\(paramName=(.+), paramValue=(.+)\)");
static ParamField of(String line) {
Matcher matcher = pattern.matcher(line);
if (!matcher.find()) {
throw new IllegalArgumentException("Bad input format");
}
return new ParamField(matcher.group(1), matcher.group(2));
}
}

使用类似

的用法
List<ParamField> paramFields = lines.stream()
.map(ParamField::of)
.toList();

,然后处理该数据。例如,构建字符串:

String result = paramFields.stream()
.map(paramField -> paramField.name() + "-" + paramField.value())
.collect(Collectors.joining(";"));

Enum

如果你需要对数据做更复杂的事情,我建议你更进一步,也把输入一个enum,例如:

enum ParamValue {
ADMITTED("Admitted"),
DISCARDED("Discarded");
// field, constructor, getter, of-method
}

,这样你就不必再处理原始字符串,而是获得Java所能提供的所有类型安全。

在流API中使用Pattern和Matcher类:

Pattern pattern = Pattern.compile("ParamField\(paramName=(.+), paramValue=(.+)\)");
var result = Stream.of(
"ParamField(paramName=Thomas, paramValue=Admitted)",
"ParamField(paramName=Martin, paramValue=Discarded)",
"ParamField(paramName=Steve, paramValue=Admitted)"
).map(pattern::matcher)
.filter(Matcher::find)
.map(m -> String.format("%s-%s", m.group(1), m.group(2)))
.collect(Collectors.joining(";"));
System.out.println(result);

相关内容

  • 没有找到相关文章

最新更新