Java正则表达式的最短匹配实现(如找出短信模板的变量)

2021-10-13 12点热度 0人点赞 0条评论

问题描述

如下一串短信模板:

尊敬的${name}:${companyName}邀请您于${startDate}为${studentName}的学生就『${courseName}』做专题授课,地址是${courseAddress}。

我们需要利用正则表达式找出短信模板里的变量:${variable}

一开始我使用的正则表达式是:${(.+)}

public class Test {
    public static void main(String[] args) throws Exception {
        String string = "尊敬的${name}:${companyName}邀请您于${startDate}为${studentName}的学生就『${courseName}』做专题授课,地址是${courseAddress}。";

        Pattern pattern = Pattern.compile("\\$\\{(.+)}");
        Matcher matcher = pattern.matcher(string);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }

}

打印结果只有一行:

${name}:${companyName}邀请您于${startDate}为${studentName}的学生就『${courseName}』做专题授课,地址是${courseAddress}

将会匹配从头到位,中间都包括进去了。

问题解决

所以应该使用正则表达式里的懒惰限定符

懒惰限定符:
*? 重复任意次,但尽可能少重复(最短匹配,非贪婪匹配)
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

 

public class Test {
    public static void main(String[] args) throws Exception {
        String string = "尊敬的${name}:${companyName}邀请您于${startDate}为${studentName}的学生就『${courseName}』做专题授课,地址是${courseAddress}。";

        Pattern pattern = Pattern.compile("\\$\\{(.*?)}");
        Matcher matcher = pattern.matcher(string);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }

    }

}

将打印出:

${name}
${companyName}
${startDate}
${studentName}
${courseName}
${courseAddress}

admin

这个人很懒,什么都没留下

文章评论

*

code