如题:
判断一个title字符串是否可以由template模版生成。这道题完全可以由正则表达式判断,拿template="ad{xyz}cdc{y}f{x}e"举例:
"ad{xyz}cdc{y}f{x}e" 将通配符都替换->"ad.cdc.f.e" 前后加开始结束符号->"^ad.*cdc.*f.*e$"。 用这个^ad.*cdc.*f.*e$正则表达式就可以判断全部字符串是否又该template模版生成。
详细解释这个正则表达式: ^:表示字符串的开始。这意味着匹配的字符串必须以接下来的模式开头。 ad:就是ad原生字符 .: '.'匹配除换行符以外的任何单个字符。''表示前面的字符可以出现0次或多次。 cdc:就是cdc原生字符 .:'.'匹配除换行符以外的任何单个字符。''表示前面的字符可以出现0次或多次。 f:就是f原生字符 .:'.'匹配除换行符以外的任何单个字符。'*'表示前面的字符可以出现0次或多次。 e:就是e原生字符 $:表示字符串的结束。这意味着匹配的字符串必须以 "e" 结尾。 有了该思路,所以完整代码为:
import java.util.regex.Pattern;
public class Main {
public static String solution(int n, String template, String[] titles) {
// 将模板转换为正则表达式
String regex = template.replaceAll("\\{[^}]*}", ".*");
// 确保匹配整个字符串
regex = "^" + regex + "$";
// 创建一个StringBuilder来存储结果
StringBuilder result = new StringBuilder();
// 检查每个标题是否匹配正则表达式
for (int i = 0; i < n; i++) {
if (Pattern.matches(regex, titles[i])) {
result.append("True");
} else {
result.append("False");
}
if (i < n - 1) {
result.append(",");
}
}
return result.toString();
}
public static void main(String[] args) {
// 测试样例1
String[] testTitles1 = {"adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"};
String[] testTitles2 = {"CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"};
String[] testTitles3 = {"abcdefg", "abefg", "efg"};
System.out.println(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1).equals("True,False,False,True"));
System.out.println(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2).equals("False,False,False,False,False,True"));
System.out.println(solution(3, "a{bdc}efg", testTitles3).equals("True,True,False"));
}
}
一些正则表达式基础知识:
字符类:
- [abc]:代表a或者b,或者c字符中的一个。
- [^abc]:代表除a,b,c以外的任何字符。
- [a-z]:代表a-z的所有小写字符中的一个。
- [A-Z]:代表A-Z的所有大写字符中的一个。
- [0-9]:代表0-9之间的某一个数字字符。
- [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
- [a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。
逻辑运算符:
- &&并且
- |:或者
- \:转义字符
预定义字符:
- "." : 匹配任何字符。
- "\d":任何数字[0-9]的简写;
- "\D":任何非数字[^0-9]的简写;
- "\s": 空白字符:[ \t\n\x0B\f\r] 的简写
- "\S": 非空白字符:[^\s] 的简写
- "\w":单词字符:[a-zA-Z_0-9]的简写
- "\W":非单词字符:[^\w] 数量词:
- X? : 0次或1次
- X* : 0次到多次
- X+ : 1次或多次
- X{n} : 恰好n次
- X{n,} : 至少n次
- X{n,m}: n到m次(n和m都是包含的)