题目描述:
在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)(不包含. , 等特殊字符)
?:匹配1个字符
输入
通配符表达式;
一组字符串。
输出
返回匹配的结果,正确输出true,错误输出false
思路:
分三种情况:
(1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false
(2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,否则匹配失败,输出false
(3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,否则匹配失败,输出false
如果最后经过循环后没有false输出,则表明匹配成功,输出true
import java.util.Scanner; /**
* 在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。
* 现要求各位实现字符串通配符的算法。
* 要求:
* 实现如下2个通配符:
* *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
* ?:匹配1个字符
*
* 输入
* 通配符表达式;
* 一组字符串。
* 输出
* 返回匹配的结果,正确输出true,错误输出false
*
*/
public class StringMatch { public static void main(String[] args) {
//输入,读入两行字符
Scanner cin = new Scanner(System.in) ;
String str = cin.nextLine() ;
String strMatch = cin.nextLine() ;
cin.close(); int len = str.length() ;
int lenMatch = strMatch.length() ;
int i = 0 ;
int j = 0 ; char temp ;
//循环比较,判断条件是当任一个到达字符串尾时结束循环
while(i < len && j < lenMatch ){
/*
* 分三种情况:
* (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false
* (2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,
* 否则匹配失败,输出false
* (3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,
* 否则匹配失败,输出false
* 如果最后经过循环后没有false输出,则表明匹配成功,输出true
*/
if(str.charAt(i) != '*' && str.charAt(i) != '?' ){
//(1)无通配符的情况
if(str.charAt(i) != strMatch.charAt(j)){
//匹配失败,输出false
System.out.println("false");
return ;
}else{
//匹配成功,进入各自下一个字符的匹配
i++ ;
j++ ;
continue ;
}
}else if(str.charAt(i) == '?'){
//(2)通配符为?的情况
temp = strMatch.charAt(j) ;
if( (temp >= 'a' && temp <= 'z')
|| (temp >= 'A' && temp <= 'Z')
|| (temp >= '0' && temp <= '9')){
//匹配成功,进入各自下一个字符的匹配
i++ ;
j++ ;
continue ;
}else{
//匹配失败,输出false
System.out.println("false");
return ;
}
}else{
//(3)通配符为*的情况
temp = strMatch.charAt(j) ;
if( (temp >= 'a' && temp <= 'z')
|| (temp >= 'A' && temp <= 'Z')
|| (temp >= '0' && temp <= '9')){
//strMatch的当前字符匹配成功,进入strMatch的下一个字符的匹配
j++ ;
continue ;
}else{
//匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,
//表明StrMatch的当前字符为非数字、字母的字符,必须匹配str中*后一个字符
if(i == (len-1)){
//如果str中*是最后一个,则匹配失败,输出false
System.out.println("false");
return ;
}else{
//如果str中*不是最后一个,则继续str中的下一个,继续匹配
i++ ;
continue ;
}
}
}
} System.out.println("true");
return ;
} }