`
marlonyao
  • 浏览: 252696 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通配符匹配

阅读更多
在网上看到通配符匹配的C语言实现,代码很漂亮。如果使用递归,代码可以更清晰一些,以下是我修改之后的代码:
int wildcard_matches(const char *wildcard, const char *str) {
	if (*wildcard == '\0')
		return *str == '\0';
	if (*wildcard == '?')
		return wildcard_matches(++wildcard, ++str);
	else if (*wildcard == '*') {
		for (++wildcard; *str; ++str)
			if (wildcard_matches(wildcard, str))
				return TRUE;
		return *wildcard == '\0';
	} else
		return *wildcard == *str && wildcard_matches(++wildcard, ++str);
}

我曾用java实现过通过符匹配,思想是将wildcard用'*'分割成多个部分,然后对每个部分进行匹配,因为时间效率可以达到O(k),这种算法看起来效率更高(对此我十分怀疑),但实现却比上面要复杂得多,花了差不多一个下午才实现并测试完毕,中间出现许多bug,多次的bug修复导致代码惨不忍睹,测试通过之后,我不想再碰那个代码。而上面的C语言代码我花了不到一个小时(并不快),中间出现一个bug,但我很快就修复了,实现完成之后,我仔细阅读了代码,深叹其实现之优雅。这就不同代码带来的巨大差异。《代码之美》第一章讲的是一个简易的正则表达式实现,现在看来其优雅程序当然要超过我上面的代码,但我当初却没有太多感觉,仅仅是因为我没有实现过正则表达式。从这点上来说,程序员不仅需要多读优秀的代码,也要经常写代码,哪怕是再重新实现一遍。

好代码的好处是很容易优化,上面的代码使用递归来实现,通过“代码变换”很容易将"尾递归"改成使用"while循环",如下:
int wildcard_matches(const char *wildcard, const char *str) {
	while (1) {
		if (*wildcard == '\0')
			return *str == '\0';
		if (*wildcard == '?') {
			++wildcard; ++str;
		} else if (*wildcard == '*') {
			for (++wildcard; *str; ++str)
				if (wildcard_matches(wildcard, str))
					return TRUE;
			return *wildcard == '\0';
		} else {
			if (*wildcard != *str)
				return FALSE;
			++wildcard; ++str;
		}
	}
}

这几乎是某种直译:将整个body套在while(1)循环中,然后删掉尾递归。再通过一些“代码变换”,很容易将上面再简化:
int wildcard_matches2(const char *wildcard, const char *str) {
	for (;*wildcard; ++wildcard, ++str)
		if (*wildcard == '*') {
			for (++wildcard; *str; ++str)
				if (wildcard_matches(wildcard, str))
					return TRUE;
			return *wildcard == '\0';
		} else if (*wildcard != '?')
			if (*wildcard != *str)
				return FALSE;
	return *str == '\0';
}

上面的代码仍然易懂,只比递归版本要稍微复杂一点,重要的是从递归版本变成迭代版本并不费力。

分享到:
评论

相关推荐

    易语言文本实现匹配通配符

    在IT领域,编程语言是构建各种软件...易语言的语法简洁,易于理解和编写,使得即使是初学者也能快速掌握通配符匹配的实现方法。如果你需要更高级的匹配功能,可以考虑引入正则表达式库,这将提供更强大的文本处理能力。

    C语言通配符匹配、文件名通配符匹配算法(wildchar.c)

    文件名通配符,比如:*.txt,?.txt。一个通配符匹配算法,一个ANSI C函数就OK了

    文件通配符匹配代码.txt

    ### 文件通配符匹配知识点详解 #### 一、文件通配符基础知识 在计算机科学领域,文件通配符(File Wildcards)是一种用于模糊匹配文件名的符号集合,主要用于操作系统命令行工具中进行文件筛选。通配符可以简化对...

    2_算法之通配符匹配_源码

    通配符匹配是一种在计算机科学中常见的算法问题,它涉及到字符串处理和模式匹配。这个算法主要用于文本搜索、文件查找等领域,允许用户使用特殊字符(如星号(*)和问号(?))来代表任意数量的字符或单个字符。在本案例...

    python 实现 通配符匹配

    ' 和 '*' 的通配符匹配。 # '?' 可以匹配任何单个字符。 # '*' 可以匹配任意字符串(包括空字符串)。 # 两个字符串完全匹配才算匹配成功。 # 说明: # s 可能为空,且只包含从 a-z 的小写字母。 # p 可能为...

    C语言入门-leetcode练习之第44题通配符匹配.zip

    在本压缩包文件中,我们关注的是C语言的编程学习,特别是通过LeetCode平台上的第44题——“通配符匹配”来进行实践。LeetCode是一个广受欢迎的在线编程挑战平台,它帮助开发者提高编程技能,尤其是对于算法和数据...

    字符串/通配符匹配(C++)

    C++实现字符串匹配函数,匹配中可以包括通配符

    通配符匹配.md

    通配符匹配.md

    python 给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?' 和 '*' 匹配规则的通配符匹配

    ' 和 '*' 匹配规则的通配符匹配: '?' 可以匹配任何单个字符。 '*' 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。 示例 1: ...

    44通配符匹配.zip

    44通配符匹配.zip

    python-leetcode面试题解之第44题通配符匹配-题解.zip

    本题解将聚焦于LeetCode第44题——通配符匹配,通过Python来解答这个问题。 通配符匹配问题在计算机科学中属于字符串匹配的范畴,它涉及到如何判断一个字符串是否符合特定的通配符模式。在LeetCode的第44题中,我们...

    Node.js-matcher-简单的通配符匹配

    在Node.js环境中,文本处理是常见的任务之一,而“matcher”就是这样一个用于简单通配符匹配的工具。本文将深入探讨“matcher”库及其在Node.js中的应用。 首先,Matcher库是由Sindre Sorhus开发的,他是一位知名的...

    c++-c++编程基础之leetcode题解第44题通配符匹配.zip

    第44题"通配符匹配"是LeetCode中的一个经典问题,它涉及到字符串处理和动态规划等核心编程概念。在这个问题中,你需要实现一个函数来判断一个给定的字符串(字符串s)是否可以被另一个包含通配符(*和?)的字符串...

    带通配符的字符串匹配算法

    带通配符的字符串匹配算法则是这个领域的延伸,它允许在模式字符串中包含特殊字符,如星号(*)或问号(?),以表示任意字符或单个任意字符。这种算法使得搜索更加灵活,可以适应更复杂的查询需求。 **通配符的含义** -...

    通配符匹配1

    通配符匹配是一种在字符串比较中使用特殊字符(如 '?' 和 '*')来表示灵活匹配的机制。在这个问题中,我们面临的是一个编程挑战,通常在LeetCode等在线平台出现,目的是测试开发者的算法和逻辑思维能力。以下是这个...

    通配符 校验 C语言 函数库

    C语言标准库中提供了一个名为`<stdio.h>`的头文件,其中包含了`wildcard_match`函数,用于进行通配符匹配。但请注意,这个函数并非标准C库的一部分,而是某些开发环境或库提供的扩展。实际应用中,我们可能需要自己...

    正则表达式或通配符匹配的代码

    先用如“7-Zip”解压软件将regexp.shar.Z解压为regexp.shar。再将regexp.shar拷贝至Desktop Linux下,在命令行终端用 sh regexp.shar解压它,然后就可以看到各文件了。

    简单的通配符匹配-Node.js开发

    matcher简单的通配符匹配,当您要接受松散的字符串输入并且正则表达式/ glob太复杂时,很有用。 安装$ npm install --save matcher用法const matcher = require('matche matcher简单的通配符匹配当您想接受松散的...

    支持通配符的模式匹配算法

    通配符模式匹配是计算机科学中的一个重要概念,特别是在文本处理、搜索算法以及文件系统路径匹配等领域广泛应用。在给定的场景中,我们关注的是如何设计一个算法来处理包含特殊字符`?`和`*`的模式串,并在主串中找到...

    易语言匹配通配符API源码

    在易语言编程环境中,"匹配通配符API源码"是指使用特定的API函数来实现对字符串进行通配符匹配的功能。易语言是一种简洁、直观的中文编程语言,旨在降低编程难度,让更多人能参与到程序设计中。在这个场景中,"SanYe...

Global site tag (gtag.js) - Google Analytics