在matcher.replace方法中,只有:
replaceFirst()和replaceAll()两种方法
我想限制更换3次,怎么办?
例:
String content="aaaaaaaaaa";
Run Code Online (Sandbox Code Playgroud)
我想得到的结果是: "bbbaaaaaaa"
我的代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class T1 {
public static void main(String[] args) {
String content="aaaaaaaaaa";
Pattern pattern = Pattern.compile("a");
Matcher m=pattern.matcher(content);
if(m.find()){
String result=m.replaceFirst("b");
System.out.println(result);
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢 :)
appendReplacement/Tail你不得不使用appendReplacement和appendTail明确.不幸的是你必须StringBuffer这样做.这是一个片段(另见ideone.com):
String content="aaaaaaaaaa";
Pattern pattern = Pattern.compile("a");
Matcher m = pattern.matcher(content);
StringBuffer sb = new StringBuffer();
final int N = 3;
for (int i = 0; i < N; i++) {
if (m.find()) {
m.appendReplacement(sb, "b");
} else {
break;
}
}
m.appendTail(sb);
System.out.println(sb); // bbbaaaaaaa
Run Code Online (Sandbox Code Playgroud)
StringBuffer是synchronized,因此慢StringBuilderMatcher应该多利用Appendable
Matcher附加到任何Appendable这是另一个示例,显示如何appendReplacement/Tail让您更好地控制替换replaceFirst/replaceAll:
// replaces up to N times with uppercase of matched text
static String replaceUppercase(int N, Matcher m) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < N; i++) {
if (m.find()) {
m.appendReplacement(
sb,
Matcher.quoteReplacement(m.group().toUpperCase())
);
} else {
break;
}
}
m.appendTail(sb);
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
然后我们就可以了(另见ideone.com):
Pattern p = Pattern.compile("<[^>]*>");
Matcher m = p.matcher("<a> b c <ddd> e <ff> g <$$$> i <jjj>");
System.out.println(replaceUppercase(4, m));
// <A> b c <DDD> e <FF> g <$$$> i <jjj>
// 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
该模式<[^>]*>只是一个匹配的简单示例模式"<tags like this>".
请注意,Matcher.quoteReplacement有必要在此特殊情况下,否则追加"<$$$>"作为替代会引发IllegalArgumentException关于非法团体引用(因为$转义替换字符串是一个反向引用印记).
replaceFirst和replaceAll附件是和(版本1.64 06/04/07)的java.util.regex.Matcher代码.请注意,它使用基本相同的逻辑完成:replaceFirstreplaceAllappendReplacement/Tail
// Excerpt from @(#)Matcher.java 1.64 06/04/07
public String replaceFirst(String replacement) {
if (replacement == null)
throw new NullPointerException("replacement");
StringBuffer sb = new StringBuffer();
reset(); // !!!!
if (find())
appendReplacement(sb, replacement);
appendTail(sb);
return sb.toString();
}
public String replaceAll(String replacement) {
reset(); // !!!!
boolean result = find();
if (result) {
StringBuffer sb = new StringBuffer();
do {
appendReplacement(sb, replacement);
result = find();
} while (result);
appendTail(sb);
return sb.toString();
}
return text.toString();
}
Run Code Online (Sandbox Code Playgroud)
请注意,Matcher它reset()在任何之前replaceFirst/All.因此,简单地调用replaceFirst3次总会得到相同的结果(另见ideone.com):
String content="aaaaaaaaaa";
Pattern pattern = Pattern.compile("a");
Matcher m = pattern.matcher(content);
String result;
result = m.replaceFirst("b"); // once!
result = m.replaceFirst("b"); // twice!
result = m.replaceFirst("b"); // one more for "good" measure!
System.out.println(result);
// baaaaaaaaa
// i.e. THIS DOES NOT WORK!!!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2074 次 |
| 最近记录: |