求助 , Java 字符串中的某个字母在不同位置替换成不同的值?

小杨阿哥哥 发布于 2018/07/22 12:40
阅读 1K+
收藏 0

举个例子,比如 select a,b,c from table1 where a = ? and x = ? ,我想替换成

select a,b,c from table1 where a = ?1 and x = ?2 ,怎么样高效的替换?

加载中
2
canghailan
canghailan

正则

Pattern pattern = Pattern.compile("\\?");
String text = "select a,b,c from table1 where a = ? and x = ? ";

int index = 1;
StringBuffer buffer = new StringBuffer();
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    matcher.appendReplacement(buffer, "?" + (index++));
}
matcher.appendTail(buffer);

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

// select a,b,c from table1 where a = ?1 and x = ?2 

 

小杨阿哥哥
小杨阿哥哥
perfect!
1
tcxu
tcxu
	String s1 = "select a,b,c from table1 where a = ? and x = ? ";
	String s2= s1.replaceFirst("[?]","1");
	String s3= s2.replace('?','2');
	System.out.println(s3);//s3 是最后结果

 

1
小杨阿哥哥
小杨阿哥哥

appendReplacement

public Matcher appendReplacement(StringBuffer sb,
                                 String replacement)

实现非终端添加和替换步骤。

此方法执行以下操作:

  1. 它从添加位置开始在输入序列读取字符,并将其添加到给定字符串缓冲区。在读取以前匹配之前的最后字符(即位于索引 start() - 1 处的字符)之后,它就会停止。

  2. 它将给定替换字符串添加到字符串缓冲区。

  3. 它将此匹配器的添加位置设置为最后匹配位置的索引加 1,即 end()

替换字符串可能包含到以前匹配期间所捕获的子序列的引用:$g 每次出现时,都将被 group(g) 的计算结果替换。$ 之后的第一个数始终被视为组引用的一部分。如果后续的数可以形成合法组引用,则将被合并到 g 中。只有数字 '0' 到 '9' 被视为组引用的可能组件。例如,如果第二个组匹配字符串 "foo",则传递替换字符串 "$2bar" 将导致 "foobar" 被添加到字符串缓冲区。可能将美元符号 ($) 作为替换字符串中的字面值(通过前面使用一个反斜线 (\$))包括进来。

注意,在替换字符串中使用反斜线 (\) 和美元符号 ($) 可能导致与作为字面值替换字符串时所产生的结果不同。美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。

此方法设计用于循环以及 appendTail 和 find 方法中。例如,以下代码将 one dog two dogs in the yard 写入标准输出流中:

Pattern p = Pattern.compile("cat");
 Matcher m = p.matcher("one cat two cats in the yard");
 StringBuffer sb = new StringBuffer();
 while (m.find()) {
     m.appendReplacement(sb, "dog");
 }
 m.appendTail(sb);
 System.out.println(sb.toString());

 

参数:

sb - 目标字符串缓冲区。

replacement - 替换字符串。

返回:

匹配器。

抛出:

IllegalStateException - 如果没有尝试任何匹配,或者以前的匹配操作失败。

IndexOutOfBoundsException - 如果替换字符串引用模式中不存在的捕获组。

appendTail

public StringBuffer appendTail(StringBuffer sb)

实现终端添加和替换步骤。

此方法从添加位置开始从输入序列读取字符,并将其添加到给定字符串缓冲区。可以在一次或多次调用 appendReplacement 方法后调用它来复制剩余的输入序列。

 

参数:

sb - 目标字符串缓冲区。

返回:

目标字符串缓冲区。

0
C__C_60412
C__C_60412
StringBuild/StringBuffer.append 可以体验下kotlin "a = $a and b =$b"
0
哎呦呦哟
哎呦呦哟
先对?split,再用stringbuffer拼接
返回顶部
顶部