问题描述
如下一串短信模板:
尊敬的${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}
文章评论