gpt4 book ai didi

java - 正则表达式替换为 Stream

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:39 24 4
gpt4 key购买 nike

好奇号,有没有办法用 Java Stream 来写这个?

private final static Pattern decodePattern = Pattern.compile("&#(\\d+);");

StringBuffer buf = new StringBuffer();

Matcher m = decodePattern.matcher(somestring);
while (m.find()) {
m.appendReplacement(buf, String.valueOf((char) Integer.parseInt(m.group(1))));
}
m.appendTail(buf);

String decodeString = buf.toString();

最佳答案

Java 9

通过重载来自 Matcher 的 Java 9 方法可以实现更简洁的代码类(class):
public String replaceAll​(Function<MatchResult,String> replacer) .基本上我们现在可以像这样替换代码

StringBuffer sb = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(sb, /*create replacement*/);
}
matcher.appendTail(sb);
String result = sb.toString;

String replaced = matcher.replaceAll(match -> /*create replacement*/);

例如

String replaced = Pattern.compile("\\b\\w")
.matcher("foo bar baz")
.replaceAll(match -> match.group().toUpperCase());
//replaced: "Foo Bar Baz"

还添加了对元素流匹配模式的支持: public Stream<MatchResult> results​() ,但 IMO 你的循环看起来不像流的好候选者。即使有 results()你的代码看起来像:

//BTW Java 9 provides support for StringBuilder beside StringBuffer 
//for appendReplacement/appendTail

Matcher matcher = ...
StringBuilder buf = new StringBuilder();

matcher.results()
.map(result -> String.valueOf((char) Integer.parseInt(result.group(1))) )
.forEach(replacement -> matcher.appendReplacement(buf, replacement));
matcher.appendTail(buf);

String decodeString = buf.toString();

所以它看起来并没有更干净。


Java 8

在 Java 8 中,Pattern 和 Matcher 类在流支持方面没有太大变化。仅收到图案 public Stream<String> splitAsStream(CharSequence input) 方法,但它会创建元素流,其中模式代表我们要拆分的分隔符,而不是我们想要查找的文本。

如果您想在 Java 8 中简化您的代码,请编写您自己的方法,在该方法中您将提供 Matcher 和将匹配内容映射到的函数(最好由 MatchResult 或 Matcher 表示,以便它可以访问 group(...) 方法)替换为应该代替它。

这样的方法看起来像:

public static String replaceMatches(Matcher m, Function<MatchResult, String> mapping){

StringBuffer sb = new StringBuffer();
while(m.find()){
MatchResult matchResult = m.toMatchResult();
m.appendReplacement(sb, mapping.apply(matchResult));
}
m.appendTail(sb);

return sb.toString();
}

你可以像这样使用它:

Pattern p = Pattern.compile("\\b\\w");
Matcher m = p.matcher("foo bar baz");

String result = replaceMatches(m, mr -> mr.group().toUpperCase());

System.out.println(result);

结果:Foo Bar Baz .

关于java - 正则表达式替换为 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39947849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com