java 正则匹配字符进行替换字符匹配多组的时候有误

问题是这样的,我需要将大括号的文字进行加粗处理
比如 从{二仙桥}到成华大道
变成 二仙桥到成华大道
代码如下

 Pattern PATTERN = Pattern.compile("\\{(\\S+)}");
        String str = "从{二仙桥}到{成华大道}";
        Matcher matcher = PATTERN.matcher(str);
        while (matcher.find()) {
            String key = matcher.group(0);
            String value = matcher.group(1);
            str = str.replace(key, String.format("<span style='font-weight:bold'>%s</span>", value));
         // 输出的结果 从<span style='font-weight:bold'>二仙桥}到{成华大道</span>
  }

但是问题来了,如果你的大括号是多组的情况下,会匹配有问题,因为\S是匹配所有非空字符 而大括号也是属于非空字符
导致替换有误,但是我们在匹配的时候,是把{} 做为一组

我已解决,通过正则非贪婪匹配Pattern.compile("\{(.+?)}");

这样试试。

img

img


可以这样写,望采纳!


import java.util.*;
import java.util.regex.*;

public class Main {

    public static void main(String[] args) {
       Pattern PATTERN = Pattern.compile("\\{(.+?)}");
        String str = "从{二仙桥}到{成华大道}";
        Matcher matcher = PATTERN.matcher(str);
        while (matcher.find()) {
            String key = matcher.group(0);
            String value = matcher.group(1);
            str = str.replace(key, String.format("<span style='font-weight:bold'>%s</span>", value));
         // 输出的结果 从<span style='font-weight:bold'>二仙桥}到{成华大道</span>
     }
    System.out.println(str);

    }

}

把正规里面的\\S+换成.+?可以解决问题,实测可行。

正则有问题,改成Pattern.compile("{(.+?)}");