题目:实现路由转发模块,根据功能号进行匹配,匹配原理是根据实际请求的功能号是否与预先配置的转发规则匹配,转发规则支持?和*,例如转发规则600???,实际请求功能号是600570则通过,不可调用已有的实现函数,实际过程中,功能号只会是0-9或者a-z(大小写敏感),预定义的模式匹配串只包含0-9,a-z,?,*
参考以下博客
java 配对_Java实现通配符匹配_weixin_39588432的博客-CSDN博客
原理:s为带匹配的字符串,p是匹配规则,将s和p的字段一个个取出来比较是不是一样,匹配规则取到?的时候可以匹配字符串的任意字符,匹配规则取到*的时候记录下当前位置,然后匹配规则后跳1位匹配,失败的话回溯并将带匹配的字符串后跳1位(意思就是遇到*号,先当成不匹配字符看看可不可以,不行的话就当做匹配1个,再不行就匹配2个...),一直到匹配的字符串匹配完,如果匹配规则还没有结束,就要看匹配规则剩余的字符串是不是全是*号,全是的话匹配成功,否则匹配失败
/**
*
* @param s 待匹配的字符串
* @param p 匹配规则
* @return
*/
public static Boolean isMatch(String s,String p){
//s的索引位置
int i=0;
//p的索引位置
int j=0;
//通配符时回溯的位置
int ii=-1;
int jj=-1;
while(i<s.length()){
if(j<p.length()&&p.charAt(j)=='*'){
//遇到通配符了,记录下位置,规则字符串+1,定位到非通配字符串
ii=i;
jj=j;
j++;
}else if(j<p.length()&&(s.charAt(i)==p.charAt(j)||p.charAt(j)=='?')){
//匹配到了
i++;
j++;
}else{
//匹配失败,需要判断s 是否被p的*号匹配着
if(jj==-1){//前面没有通配符
return false;
}
//回到之前记录通配符的位置
j=jj;
//带匹配字符串也回到记录的位置,并后移一位
i=ii+1;
}
}
//当s的每一个字段都匹配成功以后,判断p剩下的串,是*则放行
while(j<p.length()&&p.charAt(j)=='*'){
j++;
}
//检测到最后就匹配成功
return j==p.length();
}