ali曾经有这样一道题:
这道题还是有点难理解的,我经过多次琢磨,才发现,其实点可以代表a,而*不可以代表a,
aaa和a.a可以匹配说明只要出现3个a,或者a和点的数量之和为3就算匹配,超过或者少于都不算匹配
理解了题就好办了。
这个题的解法也有一大堆,但我看后似乎没怎么使用到正则
下面给出我的解法
String rex=”([^a.]*[.a][^a.]*){3}”;
使用上面的正则表达式即可判断字符串是否满足条件
[^a.]* 表示排除a和. 的所有字符,*表示可以出现0或多次
[.a] 表示出现a或.
整个() 表示只出现一次a或.的字符串,
{3} 表示这样的()要出现3次
代码如下:
public static void main(String[] args) throws ParseException {
String rex="([^a.]*[.a][^a.]*){3}";
String s="2232aa.aeerra.333a33";
Pattern p=Pattern.compile(rex);
Matcher m=p.matcher(s);
System.out.println("字符串:"+s+" 满足的子串:");
while(m.find()) {
System.out.println(m.group());//使用matcher找出一个串满足的子串
}
System.out.println("------测试字符串是否匹配正则------------");
System.out.println("a*a*aa".matches(rex));//FALSE
System.out.println("a*a*a".matches(rex));//TRUE
System.out.println("a.a".matches(rex));//TRUE
System.out.println("a*a".matches(rex));//FALSE
}
运行结果: