正则表达式匹配

本博客探讨如何实现一个函数,该函数能够匹配包含'.'和'*'的正则表达式。其中,'.'代表任意单个字符,'*'表示其前一字符可以出现任意次数(包括0次)。文章通过示例说明了什么是有效的匹配,如"aaa"匹配"a.a"和"abaca",但不匹配"aa.a"和"ab*a"。
摘要由CSDN通过智能技术生成

题目描述
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

package 字符串;
 /* 讨论2种:先看 * 再看 匹配
     * 前提:当pattern遍历完,return取决于str是否遍历完,str恰好遍历完才返回true,再接下来讨论
     *  1.若当前字符存在下一个字符,看下一个字符是否是 '*',如果是,有2种情况
     *      一:当前匹配
     *      1.1match(str,i + 1,pattern,j)//跳过str
     *      1.2match(str,i,pattern,j + 2)//跳过pattern
     *      1.3match(str,i + 1,pattern,j + 2)//这一种可以省略,相当于 1.1 + 1.2
     *      二:当前不匹配
     *      match(str,i,pattern,j + 2)//跳过pattern
     * 2.下一个不是 *
     *     当前匹配 return match(str,i + 1,pattern,j + 1)
     */
public class 正则表达式匹配 {
	 public boolean match(char[] str, char[] pattern)
	    {
	       if(str==null||pattern==null) return false; 
	       return match(str,0, pattern,0);
	    }
	 
		 private  boolean match(char[] str, int i, char[] pattern, int j) {
		        if(j == pattern.length)//pattern遍历完了
		             return str.length == i;//如果str也完了,返回true,不然false
		        //注意数组越界问题,一下情况都保证数组不越界
		        if(j < pattern.length - 1 && pattern[j + 1] == '*') {//下一个是*
		            if(str.length != i && //当前匹配
		                    (str[i] == pattern[j] || pattern[j] == '.')) //匹配
		                return match(str,i,pattern,j + 2)
		                        || match(str,i + 1,pattern,j);
		            else//当前不匹配
		                return match(str,i,pattern,j + 2);
		        }
		        //下一个不是“*”,当前匹配
		        if(str.length != i && (str[i] == pattern[j] || pattern[j] == '.'))
		            return match(str,i + 1,pattern,j + 1);
		         return false;
		     }
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值