业务需求
今天刚接到了一个业务需求,这个需求包含了一个在字符串种寻找{0}这种小功能的实现。我寻思着像这种计数的java应该是有直接可以使用的方法的。立马去翻jdk文档
String的实现方式
String类中我并没有找到可以直接拿来用的方法,但是可以用其他方法实现需求:
count = 0;
str = "{0}sdjfpoajsdf{1}daspjfpsd{2}";
for(i=0;;i++)
{
if(str.contains("{"+i+"}"))
count++
else
break
}
// 大概思路是这个样子
这种循环读取的方式我感觉不是特别舒服,所以我去找正则的实现方式
正则表达式的实现方式
1
String regex = "\\{[0-9]+\\}"
String str = "{0}asfsdafds{1}asfdsafdsa{2}adsffd"
str.matches(regex)
这个返回结果为false,这东西是用来匹配整个字符串的,不是用来找字符串里面有多少个符合要求的字串的
2
String c = messageMould.getMouldContent();
// 注意特殊字符要转义符\\,找{在正则表达式中写成\\{
Pattern p = Pattern.compile("\\{[0-9]+\\}");
Matcher matcher =p.matcher("{0}asfsdafds{1}asfddsa{2}affd");
int count = 0;
while (matcher.find())
{
count++;
}
注意这里有一个坑,我看到网上很多人使用
matcher.groupCount()
上面那条语句来寻找有多少个符合正则表达式的字串,但是我自己去尝试的时候发现这条语句根本不能找到有多少个符合正则表达式的子串
(jdk1.8)。
String c = messageMould.getMouldContent();
Pattern p = Pattern.compile("\\{[0-9]+\\}");
Matcher matcher =p.matcher("{0}asfsdafds{1}asfddsa{2}affd");
Sysout.out.print("有没有找到:"+p.find());
System.out.println("多少组:"+matcher.groupCount());
输出结果是
有没有找到:true
多少组:0
然后我修改正则
//{[0-9]+//}(z)(z)(z)(z)(z)
输出结果是
有没有找到:false
多少组:5
找不到任何匹配的,groupCount()返回了5
然后我去增加()的数量发现groudCount()也一起增加
证明了groupCount()找的其实是返回你正则里面有多少个(),一个括号称为组