我有一个字符串,并希望为每一行添加一个前缀,从而产生一个新的字符串。
如何使用新的Java 8语法执行此操作?谢谢。
答案 0 :(得分:5)
您可以使用正则表达式
static String appendPrefixToEachLine(String prefix, String s) {
String ret = prefix + s.replaceAll("(\r\n|\n)", "$1" + prefix);
return ret.substring(0, ret.length() - prefix.length());
}
正如@Holger所提到的,你可以在没有带
的捕获组的情况下做到这一点return prefix+s.replaceAll("(?:\r\n?|\n)(?!\\z)", "$0"+Matcher.quoteReplacement(prefix));
这个正则表达式说,找到新线后的位置,但不是在结束之前。
答案 1 :(得分:2)
您要求使用Java 8解决方案,但没有必要为此使用任何Java 8功能。以下是我的表现:
static String prefixLines(String prefix, String input) {
return input.replaceAll(".*\\R|.+\\z", Matcher.quoteReplacement(prefix) + "$0");
}
我认为匹配整行(包括部分最后一行)比仅匹配行分隔符更容易,如Peter Lawrey's answer。仍然,+1为此。另外,感谢Holger提及quoteReplacement
,这很容易让人忘记。
请注意,我使用的\\R
匹配任何Unicode换行符。但是,在BufferedReader.readLine()
重要的情况下,这与{{1}}的行为不匹配。
答案 2 :(得分:1)
private String appendPrefixToEachLine(String prefix, String s) {
StringBuilder stringBuilder = new StringBuilder();
new BufferedReader(new StringReader(s)).lines()
.map(line -> prefix + line + '\n')
.forEach(stringBuilder::append);
// Delete last added new line
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
return stringBuilder.toString();
}
答案 3 :(得分:0)
您不应该在字符串上使用+运算符创建行。这会创建许多不必要的String中间实例。因为你有一个StringBuilder,你只需要附加一切:
private String appendPrefixToEachLine(String prefix, String s) {
StringBuilder stringBuilder = new StringBuilder();
new BufferedReader(new StringReader(s)).lines()
.forEach(line -> stringBuilder.append(prefix).append(line).append('\n'));
// Delete last added new line
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
return stringBuilder.toString();
}
答案 4 :(得分:0)
private String appendPrefixToEachLine(String prefix, String s) {
return new BufferedReader(new StringReader(s)).lines()
.collect(Collectors.joining('\n'+prefix, prefix, ""));
}
说明:收集所有行并使用提供的分隔符将它们连接起来。
答案 5 :(得分:0)
如果您的字符串可以行分隔符的任意组合(\ n或\ r \ n等),则需要保留。另外,如果您不想为空行添加前缀,此解决方案可能会很有用。它使用新的Java 8 API,并且不使用RegEx:
public static String prefixEachLine(String text, String prefix) {
StringBuilder result = new StringBuilder();
Set<Character> endLineChars = Stream.of('\n', '\r').collect(Collectors.toSet());
text.chars().forEach(ch -> {
if (result.length() == 0 || (!endLineChars.contains((char) ch)
&& endLineChars.contains(result.charAt(result.length() - 1)))) {
result.append(prefix);
result.append((char) ch);
} else {
result.append((char) ch);
}
});
return result.toString();
}