Java 按顺序将匹配项替换为项目
我在Java中有一个字符串,它包含许多模式。根据顺序,字符串中的每个模式都需要替换一个值数组。下面是该方法应该做的示例Java 按顺序将匹配项替换为项目,java,regex,replace,java-8,java-stream,Java,Regex,Replace,Java 8,Java Stream,我在Java中有一个字符串,它包含许多模式。根据顺序,字符串中的每个模式都需要替换一个值数组。下面是该方法应该做的示例 public static String replaceValues(String withPattern, String... params){ Matcher matcher = Pattern.compile("\\{\\}").matcher(withPattern); StringBuffer sb = new StringBuff
public static String replaceValues(String withPattern, String... params){
Matcher matcher = Pattern.compile("\\{\\}").matcher(withPattern);
StringBuffer sb = new StringBuffer();
int index =0;
while (matcher.find()) {
if (args.length == index) {
matcher.appendTail(sb);
return sb.toString();
}
matcher.appendReplacement(sb, params[index]);
index++;
}
return sb.toString();
}
这很有效。我只是想知道是否有一种更有效的方法来编写此代码,而不是过于声明。您可以反复使用,逐个连续替换每个参数
public static String replaceValues(String withPattern, String... params){
String string = withPattern;
for (String param: params) {
string = string.replaceFirst("\\{}", param);
}
return string;
}
因为和您可以使用withPattern
和T identity
的方法实现相同的功能
public static String replaceValues(String withPattern, String... params){
return Arrays.stream(params).reduce(
withPattern,
(pattern, param) -> pattern.replaceFirst("\\{}", param));
}
您还可以通过给
%s
而不是{}
来欺骗String.format
(但如果这一方面对您的应用程序至关重要,建议测试性能):
试试这个
static final Pattern PAT = Pattern.compile("\\{}");
static String replaceValues(String withPattern, String... parms) {
Iterator<String> p = List.of(parms).iterator();
return PAT.matcher(withPattern).replaceAll(m -> p.next());
}
@org.junit.jupiter.api.Test
void testFormat() {
System.out.println(replaceValues(
"A quick brown {} jumps over the lazy {}" , "fox", "dog"));
输出
A quick brown fox jumps over the lazy dog
数组
值定义在哪里?当参数和模式的数量不相同时,这不会有问题吗?@Apps如果值少于占位符,就会出现异常,这是显而易见的。如果with pattern
包含%
?
static final Pattern PAT = Pattern.compile("\\{}");
static String replaceValues(String withPattern, String... parms) {
Iterator<String> p = List.of(parms).iterator();
return PAT.matcher(withPattern).replaceAll(m -> p.next());
}
@org.junit.jupiter.api.Test
void testFormat() {
System.out.println(replaceValues(
"A quick brown {} jumps over the lazy {}" , "fox", "dog"));
System.out.println(replaceValues(
"A quick brown {} jumps over the lazy {}" , "fox", "dog"));
A quick brown fox jumps over the lazy dog