一个例子通俗理解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);

两种写法功能相同。PatternMatcher 的写法更适合需要重复使用同一个正则规则的情况。


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@"));
    }
}
相关推荐
一嘴一个橘子21 分钟前
MyBatis‑Plus Service 层常用自带方法
java
健康平安的活着23 分钟前
java中批量查询+stream返回map提高查询效率
java·windows·python
wear工程师24 分钟前
Spring 循环依赖为什么要三级缓存:两级会把 AOP 代理弄丢
java·spring
paopaokaka_luck26 分钟前
基于springboot3+vue3+uniapp的河南非遗数字图谱小程序(协同过滤算法、数字图谱展示、ECharts 图形化分析)
java·前端·spring boot·学习·小程序·uni-app·echarts
OPEN-F30 分钟前
C++进阶教程:类与对象深入
java·开发语言·c++
莫陌尛.30 分钟前
StarRocks Iceberg MinIO S3 301报错完整修复文档(Docker环境)
java·docker·容器
AI人工智能+电脑小能手32 分钟前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
步行cgn39 分钟前
传统 SSM 与 Spring Boot 开发对比:从配置地狱到约定优于配置
java·spring boot·后端
ttwosix1 小时前
JavaEE初阶 多线程:单例模式 | 阻塞队列
java·开发语言