繁体   English   中英

用于拆分和收集令牌的 Java 8 流

[英]Java 8 streams to split and collect tokens

我有这样的输入

abc|label1 cde|label2 xyz|label1 mno|label3 pqr|label2

我想创建一个这样的字符串

"abc cde xyz mno pqr"

这是我走了多远

 Arrays.stream(text.split(" "))
       .map(i -> i.split("\\|"))
       .collect(Collectors.joining(" "));

你很接近,但你忘了只取内部split返回的String数组的第一个元素:

Arrays.stream(text.split(" "))
      .map(i -> i.split("\\|")[0])
      .collect(Collectors.joining(" "));

这将产生所需的String

abc cde xyz mno pqr

如果您想采用不同的方法,我建议使用正则表达式。 我每天都使用regex101.com为我的应用程序构建各种表达式。 以下是我在您的情况下使用正则表达式的方法:

String input = "abc|label1 cde|label2 xyz|label1 mno|label3 pqr|label2";
Pattern p = Pattern.compile("\\w+(?=\\|)");
Matcher m = p.matcher(input);

StringJoiner joiner = new StringJoiner(" ");
while(m.find()) {
    joiner.add(m.group());
}

System.out.println(joiner.toString());

您还可以使用Andreas的表达式,它在更少的行中处理它(我对其进行了一些更改以补偿可能缺少空格的情况):

String input = "abc|label1 cde|label2 xyz|label1 mno|label3 pqr|label2";
input = String.join(" ", input.split("\\|\\w+\\d\\s*"));
System.out.println(input);

两种解决方案都产生了预期的结果:

abc cde xyz mno pqr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM