如何匹配这种模式?(Java/regex)
我需要转换字符串:如何匹配这种模式?(Java/regex),java,regex,Java,Regex,我需要转换字符串: "%s blabla %s" 进入: 我的代码如下: Pattern pattern = Pattern.compile("%s"); Matcher tokenMatcher = pattern.matcher(value); int index = 1; while(tokenMatcher.find()){ String replacement = "%"+String.valueOf(index++)+"\\$s"; value =
"%s blabla %s"
进入:
我的代码如下:
Pattern pattern = Pattern.compile("%s");
Matcher tokenMatcher = pattern.matcher(value);
int index = 1;
while(tokenMatcher.find()){
String replacement = "%"+String.valueOf(index++)+"\\$s";
value = tokenMatcher.replaceFirst(replacement);
System.out.println(value);
}
问题是程序进入无限循环,我不明白为什么。%1$s以某种方式与%s匹配
有什么想法吗?尝试重置循环中的令牌匹配器
while(tokenMatcher.find()){
String replacement = "%"+String.valueOf(index++)+"\\$s";
value = tokenMatcher.replaceFirst(replacement);
tokenMatcher = pattern.matcher(value);
}
System.out.println(value);
尝试在循环中重置令牌匹配器
while(tokenMatcher.find()){
String replacement = "%"+String.valueOf(index++)+"\\$s";
value = tokenMatcher.replaceFirst(replacement);
tokenMatcher = pattern.matcher(value);
}
System.out.println(value);
您必须使用新值重置匹配器:
while (tokenMatcher.find()) {
String replacement = "%" + String.valueOf(index++) + "\\$s";
value = tokenMatcher.replaceFirst(replacement);
tokenMatcher.reset(value); // reset
System.out.println(value);
}
原因是replaceFirst将匹配器重置为开头,但不会更改当前匹配的字符串,它仍然包含旧字符串。您必须自己更新匹配器。您必须用新值重置匹配器:
while (tokenMatcher.find()) {
String replacement = "%" + String.valueOf(index++) + "\\$s";
value = tokenMatcher.replaceFirst(replacement);
tokenMatcher.reset(value); // reset
System.out.println(value);
}
原因是replaceFirst将匹配器重置为开头,但不会更改当前匹配的字符串,它仍然包含旧字符串。您必须自己更新匹配器。请尝试下面的代码
StringBuilder stringBuilder = new StringBuilder();
int i = 1;
for (String s : input.split("%s")) {
stringBuilder.append(String.format("%s %d", s, "%"+i+++"$"));
}
String newString = stringBuilder.toString();
试试下面的代码
StringBuilder stringBuilder = new StringBuilder();
int i = 1;
for (String s : input.split("%s")) {
stringBuilder.append(String.format("%s %d", s, "%"+i+++"$"));
}
String newString = stringBuilder.toString();
最好添加一行StringBuffer初始化,因为OP的初始代码中没有该行;但这也是一个很好的解决方案+1最好添加一行StringBuffer初始化,因为OP的初始代码中没有它;但这也是一个很好的解决方案+1