当前位置: 首页 > 知识库问答 >
问题:

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

夏侯衡
2023-03-14

我有一份清单

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";

共有2个答案

龙飞
2023-03-14

“ParamField(paramName=emmeline tame-ivory@tiwwmaawnc.co.uk,paramValue=允许)”

洪飞扬
2023-03-14

这很容易通过正则表达式捕获组来实现。您的模式将是"ParamField\\(paramName=(. ), parValue=(.)\\)",然后您只需匹配并获取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并在该字符串上使用工厂方法创建一个漂亮的记录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(";"));
 类似资料:
  • 如何将过滤器列表拆分为单个过滤器元件?split2String在线程“main”java.util.regex中导致:异常。PatternSyntaxException:索引10或(|和)附近的未闭合组(

  • 问题内容: 如何在JavaScript中使用多个分隔符拆分字符串?我正在尝试在逗号和空格上进行拆分,但是AFAIK,JS的拆分功能仅支持一个分隔符。 问题答案: 传递正则表达式作为参数: 编辑添加: 您可以通过选择数组的长度减去1来获得最后一个元素: …,如果模式不匹配:

  • 在上面的示例代码中,我想根据标题拆分文本。我想通过正则表达式确定这些标题(因为可能有同义词)但是通常返回NoneType。这显然会导致错误。如果我添加一个If条件来检查我是否不是,那么错误就会消失,但字典最终会丢失大量数据。 有人知道解决这个问题的方法吗?或者知道实现同样的事情的方法吗? 请记住,以上只是一个例子。我需要使用这个为简历/简历,因此布局和标题可以略有不同,这取决于使用的简历。

  • 问题内容: 我想用和分开 因此处理后应该得到: 问题答案: 对更新问题的更新答案:

  • 问题内容: 我在网上找到了一些答案,但是我没有使用正则表达式的经验,我相信这里是需要的。 我有一个字符串,需要用分隔 或也就是说,它必须是分号或逗号后跟一个空格。没有尾随空格的单个逗号应保持不变 示例字符串: 应该拆分为包含以下内容的列表: 问题答案: 幸运的是,Python内置了:) 更新: 在你的评论之后:

  • 我正在尝试从Cisco IOS配置解析以下命令: