一个例子通俗理解Java中正则表达式用法

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@"));
    }
}
相关推荐
2401_888859711 分钟前
STM32H733 MPU、AXI、FMC学习
java·开发语言·stm32·spring
CV工程师丁Sir2 小时前
ArkWeb 手记 04|DevTools 调试与缓存清理
java·spring·缓存·harmonyos
Sarvartha8 小时前
final 关键字
java·开发语言
2601_952047799 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
数据狐(Datafox)9 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务
Escalating_xu11 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
灯澜忆梦11 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
一个风轻云淡12 小时前
GCC 和 GDB命令简单解读
java·linux·前端