题目描述:
在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下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 }
View Code
转载于:https://www.cnblogs.com/mukekeheart/p/5596807.html