MyString 类中的 checkMore 方法应返回一个 boolean 值。当字符串 s 完全符合 p 的字符模式时,应返回 true;当 s 不符合 p 的字符模式时,应返回 false。
在模式字符串 p 中,符号 # 和符号 @ 有自定义的正则匹配规则:
#用于匹配任意单个字符。@用于匹配@前面的 0 个或多个字符,因此@不会出现在首位。#和@可能会单独多次出现,但#@、@#或@@不会一起出现。
java
import java.util.regex.Pattern;
public class MyString{
public static boolean checkMore(String s,String p) {
// TODO: Read the requirements carefully and complete the method to meet the requirements
if(p.startsWith("@")){
return false;
}
String regex = "^" + p.replace("#",".").replace("@",".*") + "$";
return Pattern.matches(regex,s);
}
public static void main(String[] args){
// Partial test cases are provided, please consider completing them. The backend will use separate test cases for verification.
System.out.println(checkMore("abcdeeeefg","ab#de@fg"));
System.out.println(checkMore("aasdasda","a#sdasd#"));
System.out.println(checkMore("asdasdasss","@sdasda@"));
}
}
把模式字符串 p 先转换成 Java 正则表达式,再进行完整匹配:
- 普通字符:保持不变
#:替换为.,表示任意一个字符@:替换为.*,表示前面规则允许的任意多个字符- 用
^和$确保整个字符串都必须匹配 - 如果
p以@开头,直接返回false
以下三行可以理解为:先把字符串形式的正则表达式编译成正则对象,再用它检查目标字符串是否完全匹配。
Pattern ptn = Pattern.compile(regex);
Matcher matcher = ptn.matcher(s);
return matcher.matches();
第 1 行:编译正则表达式
Pattern ptn = Pattern.compile(regex);
regex 是正则表达式字符串,例如:
String regex = "ab.de.*fg";
Pattern.compile(regex) 会把它转换成 Java 可以执行的正则匹配对象,并保存到 ptn 中。
可以理解为:
把正则规则准备好。
第 2 行:创建匹配器
Matcher matcher = ptn.matcher(s);
这表示使用 ptn 中的规则去检查字符串 s。
例如:
s = "abcdeeeefg";
可以理解为:
准备用这个规则检查目标字符串
s。
第 3 行:执行完整匹配
return matcher.matches();
matches() 会判断 整个字符串 是否符合正则表达式:
- 完全符合:返回
true - 只部分符合或不符合:返回
false
例如:
regex = "ab.de.*fg";
s = "abcdeeeefg";
匹配过程:
ab -> ab
. -> c
de -> de
.* -> eee
fg -> fg
所以结果是:
true
三行合起来
Pattern ptn = Pattern.compile(regex);
Matcher matcher = ptn.matcher(s);
return matcher.matches();
等价于:
将
regex编译为规则,用该规则匹配s,并返回是否完全匹配的结果。
本题中也可以简写为:
return Pattern.matches(regex, s);
两种写法功能相同。Pattern 和 Matcher 的写法更适合需要重复使用同一个正则规则的情况。
java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MyString {
public static boolean checkMore(String s, String p) {
// Check if @ appears at the first position, return false
if (p.startsWith("@")) {
return false;
}
// Use regular expression to match the character pattern
String pattern = p.replace("#", ".").replace("@", ".*");
String regex = "^" + pattern + "$";
// Check if string s satisfies the character pattern p
Pattern ptn = Pattern.compile(regex);
Matcher matcher = ptn.matcher(s);
return matcher.matches();
}
public static void main(String[] args) {
// Partial test cases are provided, please consider completing them. The backend will use separate test cases for verification.
System.out.println(checkMore("abcdeeeefg", "ab#de@fg"));
System.out.println(checkMore("aasdasda", "a#sdasd#"));
System.out.println(checkMore("asdasdasss", "@sdasda@"));
}
}