一个例子通俗理解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@"));
    }
}
相关推荐
echome8882 分钟前
Python 正则表达式:5 个日常够用的模式
python·正则表达式
QianhangQianping11 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
海绵宝宝转agent17 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
SunnyDays101118 分钟前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word
SunnyDays101120 分钟前
Java 为 Word 添加页码:隐藏封面页码、从指定页开始编号、奇偶页页码设置等
java·word·页码
开源推荐官24 分钟前
多门店 O2O 商城选型复盘:从开发视角对比主流开源系统
java·架构·开源·php
吴名氏.24 分钟前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
从琳开始9891 小时前
从Socket到UDP回显服务器:Java网络编程完整指南
java·网络·网络协议·udp·java-ee
西瓜拿铁好喝2 小时前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库
学长毕设2 小时前
基于SpringBoot的校园礼服租赁系统的设计与实现
java·spring boot·后端