BUPT JAVA: 通配符

通配符

题目描述:

通配符是一种特定场合下特殊用途的符号, 用来模糊匹配. 当查找时, 可以使用它来代替一个或多个真正字符;
当不知道真正字符或者懒得输入完整名字时, 常常使用通配符代替一个或多个真正的字符.
SQL 语言中的 LIKE 子句就允许使用通配符. 其中有两个通配符含义如下:

通配符 描述
_ 匹配任意一个字符
% 匹配0个或多个字符

下表是使用这两个通配符进行匹配的示例:

样式串 匹配的串 不匹配串
a%b ab, aCCCCb, acb, adfefb等 abc, ac等
a_b acb, adb等 ab, accccb等

匹配的字符串中也包含 _% 时, 就要使用 ESCAPE 子句来告诉系统哪个 _% 不是通配符.

现在就请你写一个判断一个含有通配符的字符串在上述规则下是否与另一个字符串相匹配.
为了简化程序, 输入的样式串中出现的 _% 一定代表通配符, 且一个样式串中仅包含一个通配符, 与之相匹配的字符串中一定不包含 _%.

提示: java 可以使用 String 类的 matches 方法

输入:

第一行一个正整数 n(0<n<20)n(0 < n < 20) 后边是 nn 行, 每行包含 2 个字符串, 前边为样式串, 后边为匹配串, 中间由一个空格格开 (样式串及匹配串中均不包含空格, 所有字符串长度均小于 20, 且输入的字符均为 ASCII 字符).

输出:

n 行, 依次对应 n 行测试数据, 如果匹配串与样式串匹配则输出 yes, 否则输出no.

输入样例:

1
2
3
4
3
a%b aCCCCb
a_b aCCCCb
a%b cab

输出样例:

1
2
3
yes
no
no

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 2023/04/03
// 通配符

import java.util.*;

public class Main {
public static void main(String[] args) {
var input = new Scanner(System.in);
var n = input.nextInt();
for (int i = 0; i < n; i++) {
String str1 = input.next(), str2 = input.next();
StringBuilder regex = new StringBuilder();
for (int j = 0; j < str1.length(); j++) {
if (str1.charAt(j) == '_')
regex.append("[^_]");
else if (str1.charAt(j) == '%')
regex.append("[^%]*");
else
regex.append(str1.charAt(j));
}

if(str2.matches(regex.toString()))
System.out.println("yes");
else
System.out.println("no");
}
}
}
2023-04-03 
IP属地: 北京

BUPT JAVA: 通配符
https://dengwuli.github.io/2023/04/03/BUPT_JAVA/通配符/
作者
DengWuLi
发布于
2023年4月3日
更新于
2023年7月14日
许可协议