题目描述:
在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)(不包含. , 等特殊字符)
?:匹配1个字符
输入
通配符表达式;
一组字符串。
输出
返回匹配的结果,正确输出true,错误输出false
思路:
分三种情况:
(1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false
(2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,否则匹配失败,输出false
(3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,否则匹配失败,输出false
如果最后经过循环后没有false输出,则表明匹配成功,输出true
1 import java.util.Scanner; 2 3 /** 4 * 在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。 5 * 现要求各位实现字符串通配符的算法。 6 * 要求: 7 * 实现如下2个通配符: 8 * *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同) 9 * ?:匹配1个字符 10 * 11 * 输入 12 * 通配符表达式; 13 * 一组字符串。 14 * 输出 15 * 返回匹配的结果,正确输出true,错误输出false 16 * 17 */ 18 public class StringMatch { 19 20 public static void main(String[] args) { 21 //输入,读入两行字符 22 Scanner cin = new Scanner(System.in) ; 23 String str = cin.nextLine() ; 24 String strMatch = cin.nextLine() ; 25 cin.close(); 26 27 int len = str.length() ; 28 int lenMatch = strMatch.length() ; 29 int i = 0 ; 30 int j = 0 ; 31 32 char temp ; 33 //循环比较,判断条件是当任一个到达字符串尾时结束循环 34 while(i < len && j < lenMatch ){ 35 /* 36 * 分三种情况: 37 * (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false 38 * (2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字, 39 * 否则匹配失败,输出false 40 * (3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同, 41 * 否则匹配失败,输出false 42 * 如果最后经过循环后没有false输出,则表明匹配成功,输出true 43 */ 44 if(str.charAt(i) != '*' && str.charAt(i) != '?' ){ 45 //(1)无通配符的情况 46 if(str.charAt(i) != strMatch.charAt(j)){ 47 //匹配失败,输出false 48 System.out.println("false"); 49 return ; 50 }else{ 51 //匹配成功,进入各自下一个字符的匹配 52 i++ ; 53 j++ ; 54 continue ; 55 } 56 }else if(str.charAt(i) == '?'){ 57 //(2)通配符为?的情况 58 temp = strMatch.charAt(j) ; 59 if( (temp >= 'a' && temp <= 'z') 60 || (temp >= 'A' && temp <= 'Z') 61 || (temp >= '0' && temp <= '9')){ 62 //匹配成功,进入各自下一个字符的匹配 63 i++ ; 64 j++ ; 65 continue ; 66 }else{ 67 //匹配失败,输出false 68 System.out.println("false"); 69 return ; 70 } 71 }else{ 72 //(3)通配符为*的情况 73 temp = strMatch.charAt(j) ; 74 if( (temp >= 'a' && temp <= 'z') 75 || (temp >= 'A' && temp <= 'Z') 76 || (temp >= '0' && temp <= '9')){ 77 //strMatch的当前字符匹配成功,进入strMatch的下一个字符的匹配 78 j++ ; 79 continue ; 80 }else{ 81 //匹配字符串中下一个非字母和数字的字符必须与*后的字符相同, 82 //表明StrMatch的当前字符为非数字、字母的字符,必须匹配str中*后一个字符 83 if(i == (len-1)){ 84 //如果str中*是最后一个,则匹配失败,输出false 85 System.out.println("false"); 86 return ; 87 }else{ 88 //如果str中*不是最后一个,则继续str中的下一个,继续匹配 89 i++ ; 90 continue ; 91 } 92 } 93 } 94 } 95 96 System.out.println("true"); 97 return ; 98 } 99 100 }