java - 如何匹配这种模式? (Java/正则表达式)

标签 java regex

我需要转换字符串:

"%s blabla %s"

进入:

"%1$s blabla %2$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

匹配
%1$s blabla %s
%2$s blabla %s
%3$s blabla %s
%4$s blabla %s
%5$s blabla %s
%6$s blabla %s
%7$s blabla %s
%8$s blabla %s
%9$s blabla %s
%10$s blabla %s
etc...

有什么想法吗?

最佳答案

您必须使用新值重置您的匹配器:

while (tokenMatcher.find()) {
  String replacement = "%" + String.valueOf(index++) + "\\$s";
  value = tokenMatcher.replaceFirst(replacement);
  tokenMatcher.reset(value); // reset
  System.out.println(value);
}

原因是 replaceFirst() 将匹配器重置为开头但不会更改当前匹配的字符串,它仍然包含旧字符串。您必须自己更新匹配器。

关于java - 如何匹配这种模式? (Java/正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14985177/

相关文章:

javascript - Javascript "initialize"什么时候是 RegEx 模式?

java - 如何使用 JavaScript 覆盖类型 (GWT) 包装回调?

java - 如何在java中制作弹出窗口

java - 使用 @Body 的 Retrofit POST 请求返回空响应正文

java - Android图像淡入淡出动画

python - 使用正则表达式拆分标题和内容

用于监控音频的java生产者消费者线程

javascript - 正则表达式在检查电子邮件 ID 方面花费了太多精力

javascript - RegExp 是递归的

ruby - 在正则表达式中使用否定条件