`

[转]正则表达式匹配算法

    博客分类:
  • C
 
阅读更多

 

 《The Practice of Programming》 一书中有很多优美的示例代码。

下面的这个关于正则表达式的匹配算法的C语言版是 作者之一 Rob Pike的作品。

 

/* match: 在 text 中查找 regexp */

int match(char *regexp, char *text)
{
	if(regexp[0] == '^'){
		return matchhere(regexp+1, text);
	}
	
	do{ /* 即使字符串为空时也必须检查 */
		if(matchhere(regexp, text)){
			return 1;
		}	
	} while(*text++ != '\0');
	return 0;
}

/* matchhere: 在 text 的开头查找 regexp */
int matchhere(char *regexp, char *text)
{
	if(regexp[0] == '\0'){
		return 1;
	}
	if(regexp[1] == '*'){
		return matchstar(regexp[0], regexp+2, text);
	}
	if(regexp[0] == '$' && regexp[1] == '\0')){
		return *text == '\0';
	}
	if(*text != '\0' && (regexp[0] == '.' || regexp[0] == *text){){
		return matchhere(regexp+1, text+1);
	}
	return 0;
}

/* matchstar: 在text 的开头查找 C*regexp */
int matchstar(int c, char *regexp, char *text)
{
	do{ /* 通配符 * 匹配零个或多个实例 */
		if(matchhere(regexp, text)){
			return 1;
		}
	} while(*text != '\0' && (*text++ == c || c == '.'));
	
	return 0;
}


matchstar 的变体变体
/* matchstar: 搜索 C*regexp 的最左以及最长的匹配 */
int matchstar(int c, char *regexp, char *text)
{
	char *t;
	for(t = text; *t != '\0' && (*t == c || c == '.'); t++){
			;
	}
	
	do{ /* 通配符 * 匹配零个或多个实例 */
		if(matchhere(regexp, t)){
			return 1;
		}
	} while(t-->text);
	
	return 0;
}

 

分享到:
评论

相关推荐

    正则表达式匹配算法

    这些基础语法是构建正则表达式匹配算法的基础。 接下来,我们可以采用DFA(确定有限状态自动机)或NFA(非确定有限状态自动机)来实现正则表达式的匹配。在这个案例中,C++代码可能是基于NFA实现的,因为NFA通常更...

    正则表达式匹配算法小结

    ### 正则表达式匹配算法概述 正则表达式(Regular Expression, 简称 Regex 或 RE)是一种用于描述字符序列的模式语言,被广泛应用于文本处理、数据验证以及搜索等场景。正则表达式的匹配算法是实现这些功能的基础,...

    基于FPGA的正则表达式匹配算法综述.pdf

    文档“基于FPGA的正则表达式匹配算法综述.pdf”详细介绍了硬件正则表达式匹配的优势,FPGA在正则表达式匹配算法中的基本思想和设计方法。文档根据匹配速度和资源利用率对现有算法进行了分类,并对当前主流算法的优...

    易语言正则表达式匹配中文

    本文将深入探讨易语言中的正则表达式匹配中文的原理、方法以及应用。 正则表达式(Regular Expression)是一种模式匹配的语言,用于描述一种字符串的集合。在易语言中,我们可以通过内置的字符串函数来实现正则...

    面向网络安全的多维正则表达式匹配算法分析.pdf

    面向网络安全的多维正则表达式匹配算法分析.pdf

    基于FPGA的正则表达式匹配引擎设计.pdf

    基于FPGA的正则表达式匹配引擎设计涉及硬件加速技术,它能显著提升正则表达式匹配过程的性能。在深入探讨FPGA设计之前,我们首先需要理解正则表达式匹配引擎的作用以及为什么需要在硬件层面实现加速。 正则表达式...

    web前端-基于规则集的正则表达式匹配算法研究.pdf

    ### web前端-基于规则集的正则表达式匹配算法研究 #### 概述 随着互联网技术的迅猛发展,正则表达式作为一种强大的文本处理工具,在网络安全系统和多种服务中的应用日益广泛。尤其在网络入侵检测系统(Network ...

    Java使用正则表达式提取XML节点内容的方法示例

    为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...

    正则表达式匹配

    根据提供的文件标题、描述、标签以及部分...尽管这是一个简化的版本,但它为理解更复杂的正则表达式匹配算法提供了一个良好的起点。开发者可以根据实际需求进一步扩展和完善该算法,以支持更多类型的正则表达式特征。

    C语言正则表达式库

    3. **回溯算法**:PCRE库使用了高效的回溯算法来执行正则表达式匹配。虽然这可能会导致性能问题,但通过优化的匹配引擎和使用预编译模式,可以显著提高效率。 4. **匹配选项**:提供了许多可配置的匹配选项,例如不...

    易语言模拟正则表达式匹配

    在“易语言模拟正则表达式匹配”这个主题中,我们主要关注的是如何在易语言环境中实现正则表达式的功能,这对于处理文本数据、进行模式匹配和搜索等任务非常有用。 正则表达式(Regular Expression)是一种强大的...

    正则表达式转NFA实现

    总的来说,正则表达式转NFA的实现是理论与实践的结合,它涉及编译原理、形式语言和自动机理论等领域的知识,对于理解和处理字符串模式匹配问题具有深远的意义。在实际应用中,这一转换过程常被用于文本分析、搜索...

    实现3-11正则表达式匹配问题.cpp

    实现3-11正则表达式匹配问题.cpp

    Oracle数据库正则表达式

    1. REGEXP_LIKE:比较一个字符串是否与正则表达式匹配 2. REGEXP_INSTR:在字符串中查找正则表达式,并且返回匹配的位置 3. REGEXP_SUBSTR:返回与正则表达式匹配的子字符串 4. REGEXP_REPLACE:搜索并且替换匹配的...

    C++算法:正则表达式匹配

    给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符...

Global site tag (gtag.js) - Google Analytics