一个例子通俗理解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@"));
    }
}
相关推荐
野生技术架构师14 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
香吧香14 小时前
java服务异常日志只打印异常类型,没有堆栈定位分析
java·jvm·异常
qq_25183645715 小时前
AI 疾病自查功能SpringbootAI项目实战 · 技术实现文档
java·ai·ai编程
逆境不可逃15 小时前
Pi Agent 学习笔记:对话太长以后,如何压缩上下文
java
MetaLite15 小时前
JDK 8~26 核心特性一览:从 Stream 到 Scoped Values
java
Patrick在香港15 小时前
Claude Prompt 香港场景:公文里「今日」落在 6 个日历日上,「翌日」锚错了 5 天
python·自然语言处理·正则表达式·claude·数据清洗
wno70416 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
君顾116 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房
SL_staff17 小时前
别急着买商业规则引擎:90%风控场景根本不需要全量编码能力
java·程序员·groovy
ManageEngineITSM18 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理