C++ - 正则表达式

1目录

1正则表达式的简介

2函数及相关功能

3实例代码

4鸣谢


2正则表达式的简介

正则表达式是一个非常强大的工具,主要用于字符串匹配。如何在c++中使用正则表达式?下面就简要介绍一下c++中正则表达式相关函数的用法。

3函数及相关功能


regex_match(s,re)    目标字符串s和正则表达式re是否完全匹配
regex_search(s,match_result,re)    目标字符串s是否存在某个子串与正则表达式re匹配
regex_replace(s,re,s1)    用s1替换目标字符串s中与正则表达式re匹配的子串
 

4实例代码

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <regex>
using namespace std;
 
///
///               C++标准库中正则表达式的使用简介:
///   C++标准库中提供了对正表达式的支持,以下是常用的使用方法.
///
///   regex类:定义包含正则表达式的对象,如:regex rx("a(b?)c");
///
///   cmatch类:Type definition for char match_results.用来
///   定义保存匹配结果的对象-->typedef match_results<const char*> cmatch;
///   当待搜索的字符串是char类型是,使用此类对象
///
///   smatch类:Type definition for string match_results.用来
///   定义保存匹配结果的对象-->typedef match_results<string::const_iterator> smatch;
///   当待搜索的字符串是string类型是,使用此类对象
///   
///   ==========================以下是三个常用的正则匹配函数==================================
///   *bool regex_match(...)函数:Exactly matches a regular expression,判断是否准确匹配      *
///   *Tests whether a regular expression matches the entire target string                   *
///   *是否准确匹配整个目标字符串                                                            *
///   *注意:regex_match是目标字符串和正则表达式要完全匹配时才返回true.                       *
///   *如"abc"和"ab*c" 完全匹配,但是如果是"abcd"和"ab*c",虽然只有部分匹配(abc)但是返回是false*
///   *                                                                                      *
///   *bool regex_search(...)函数:Searches for a regular expression match.                   *
///   *在目标字符串中搜索一个匹配正则的字符串,如果搜索到了则返回true,否则返回false           *
///   *                                                                                      *
///   *regex_replace(...)函数:Replaces matched regular expressions.用指定的字符串替换匹      *
///   *配到的字符串,默认是替换所有目标字符串中匹配到的字符串,加了format_first_only标志       *
///   *表示只替换第一次匹配到的字符串                                                        *
///   ========================================================================================
///
///   ---->Regex Match Tracer 2.1:正则表达式匹配测试工具.
///
///
 
//#####---------->示例是对相关函数的多个重载形式的演示
///1.regex_match(...)使用示例:
#if 1
int main(int argc, char* argv[])
{
 
	// (1) with char*
	// Note how const char* requires cmatch and regex
	const char *first = "abc";  //待匹配字符串
	const char *last = first + strlen(first);
	cmatch narrowMatch;  //char *类型的对象来匹配保存结果
	regex rx("ab*c");  //定义包含正则表达式的对象
 
	//注意:regex_match是目标字符串和正则表达式要完全匹配时才返回true.
	// 如"abc"和"ab*c"完全匹配返回true,但是如果是"abcd"和"ab*c",虽然只有
	// 部分匹配(abc)但是返回是false
	//  regex_match有多个重载函数,可以只有三个参数,不保存结果.
	//  也可以有四个参数,第三个参数用来保存结果,一般情况下使用三个参数的就可以了
	bool found = regex_match(
		                      first,   //待匹配的开始位置
		                      last,  //待匹配的结束位置
		                      narrowMatch,  //保存结果
		                      rx    //正则表达式
		                    );  
	cout << found << endl;
	
	// (2) with std::string
	string target2("Drizzle");
	regex rx2("(D\\w+e)"); // no double backslashes with raw string literal
	found = regex_match(
		                 target2.cbegin(),  //匹配开始 -->迭代器区间开始开始位置
		                 target2.cend(),   //匹配结束 -->迭代器区间结束位置
		                 rx2   //正则表达式
		               );
	cout << found << endl;
	return 0;
}
#endif
 
///2.regex_search(...)使用示例/
///   示例是对regex_search(...)的多个重载形式的函数的使用
//
#if 1
int main()
{
	const char *first = "abcd";  //待搜索字符串
	const char *last = first + strlen(first);
	std::cmatch mr;  //保存匹配结果
	std::regex rx("abc");
	std::regex_constants::match_flag_type fl =  //regex_constants:一个名字空间
		std::regex_constants::match_default;
 
	std::cout << "search(f, f+1, \"abc\") == " << std::boolalpha  //bool类型以true或者false输出
		<< regex_search( first,  //目标字符串开始
			             first + 1,  //目标字符串结束
			             rx,  //正则表达式
			             fl  //匹配标志
			           ) << std::endl;
 
	
	std::cout << "search(f, l, \"abc\") == " << std::boolalpha
		<< regex_search( first,  //目标字符串开始
			             last,  //目标字符串结束
			             mr,  //将搜索结果存入mr
			             rx  //正则表达式
			           ) << std::endl;
	std::cout << "  matched: \"" << mr.str() << "\"" << std::endl;
 
	std::cout << "search(\"a\", \"abc\") == " << std::boolalpha
		<< regex_search( "a",  //待搜索字符串
			             rx   //正则表达式
			           ) << std::endl;
 
	std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha
		<< regex_search( "xabcd",  //待搜索字符串
			             mr,  //将搜索结果存入mr
			             rx  //正则表达式
			           ) << std::endl;
	std::cout << "  matched: \"" << mr.str() << "\"" << std::endl;
 
	std::cout << "search(string, \"abc\") == " << std::boolalpha
		<< regex_search( std::string("a"),  //待搜索字符串,此参数为string类型
			             rx  //正则表达式
			           ) << std::endl;
 
	std::string str("abcabc");
	//std::match_results<std::string::const_iterator> mr2;
	smatch mr2;  //和上面等价 typedef定义的match_results<std::string::const_iterator>别名
	std::cout << "search(string, \"abc\") == " << std::boolalpha
		<< regex_search( str,  //待搜索字符串,此参数为string类型
			             mr2, //将搜索结果存入mr2
			             rx  //正则表达式
			           ) << std::endl;
	std::cout << "  matched: \"" << mr2.str() << "\"" << std::endl;
 
	return (0);
}
#endif
 
///3.regex_replace(...)使用示例/
#if 1
int main()
{
	char buf[20];
	const char *first = "axayaz";  //待匹配字符串
	const char *last = first + strlen(first);
	std::regex rx("a");  //正则表达式
	std::string fmt("A");
	std::regex_constants::match_flag_type fonly =
		std::regex_constants::format_first_only;
 
	//默认是替换所有目标字符串总匹配到的字符串,加了format_first_only标志
	//表示只替换第一次匹配到的字符串
	*std::regex_replace( &buf[0],  //被更改字符串的迭代器
		                 first,  //目标字符串开始位置
		                 last,  //目标字符串结束位置
		                 rx,  //正则表达式
		                 fmt  //要替换的字符串
		               ) = '\0';
	std::cout << "replacement == " << &buf[0] << std::endl;
	
	*std::regex_replace(&buf[0],  //被更改字符串的迭代器
		                first,  //目标字符串开始位置
		                last,  //目标字符串结束位置
		                rx,  //正则表达式
		                fmt,  //要替换的字符串
		                fonly  //替换标志,在此表示只替换第一次匹配到的字符串
		                ) = '\0';
	std::cout << "replacement == " << &buf[0] << std::endl;
 
	std::string str("adaeaf");
	std::cout << "replacement == "
		<< std::regex_replace( str,  //目标字符串
			                   rx,   //正则表达式
			                   fmt   //要替换的字符串
			                 ) << std::endl;
 
	std::cout << "replacement == "
		<< std::regex_replace(str,  //目标字符串
			                  rx,  //正则表达式
			                  fmt,  //要替换的字符串
			                  fonly  //替换标志,在此表示只替换第一次匹配到的字符串
			                 ) << std::endl;
 
	return (0);
}
#endif
 
///4.regex_search(...)循环遍历字符串示例/
///       --------->找到目标字符串中所有匹配的子串
///       ####----->此示例中找到s串中所有以subj开头的单词,并打印出来
/
#if 1
int main()
{
	std::string s("this subject has a subjmarine as a subjsequence subjmite");
	std::smatch m;
	std::regex e("\\b(subj)([^ ]*)");    // matches words beginning by "sub"  //GCC未支持
 
	std::cout << "目标序列: " << s << std::endl;
	std::cout << "正则公式: /\\b(sub)([^ ]*)/" << std::endl;
	std::cout << "The following matches and submatches were found:" << std::endl;
 
	while (std::regex_search(s, m, e)) {
		std::cout << m.str() << std::endl;  //输出匹配结果
		//std::cout << m[0] << std::endl;  //输出匹配结果,等价于上面那种用法
		s = m.suffix().str();  // 返回末端,作为新的搜索的开始
	}
	return 0;
}
#endif

5鸣谢


版权声明:本文为CSDN博主「philpanic9」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/philpanic9/article/details/88141305

————————————————
版权声明:本文为CSDN博主「qhh0205」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qianghaohao/article/details/50727556

### 回答1: 在 C 语言中,运行正则表达式可能会卡住的原因可能有很多。其中一个原因可能是使用的正则表达式引擎在处理复杂的正则表达式时可能会出现“超时”的情况。 正则表达式是一种用来匹配文本模式的工具,它通常被用来在大型文本中搜索或替换特定的字符串。但是,如果正则表达式非常复杂或者匹配的文本非常大,那么使用正则表达式引擎处理这些表达式可能会占用大量的 CPU 时间,导致程序“卡住”。 此外,如果正则表达式中包含了一些“不优雅”的模式(例如,匹配的字符串中包含大量的重复字符),也可能会导致程序卡住。在这种情况下,可以尝试使用更有效的正则表达式来解决问题。 总的来说,如果你的程序在运行正则表达式时“卡住”,那么最好的解决办法就是尝试优化你的正则表达式,或者使用更快的正则表达式引擎来处理这些表达式。 ### 回答2: 运行正则表达式会卡住可能有以下几个原因: 1. 正则表达式的匹配模式过于复杂。某些正则表达式可能包含大量的逻辑判断、重复项匹配或回溯等操作,这会导致匹配过程非常耗时,进而导致卡顿。 2. 被匹配的文本过长或包含大量的匹配项。如果待匹配的文本非常庞大或者包含大量的匹配项,正则引擎需要不断地尝试不同的匹配组合,消耗大量的计算资源和时间,从而导致卡顿问题的产生。 3. 缺乏优化。有些正则表达式可能并没有经过充分的优化,导致在执行时效率低下。可以通过使用更精确的匹配规则、避免使用贪婪匹配、减少回溯等方法来优化正则表达式的性能。 4. 正则表达式引擎的实现问题。某些情况下,正则表达式引擎的实现可能存在漏洞或性能问题,导致在匹配过程中出现卡顿现象。 为避免正则表达式卡住的问题,可以尝试以下解决方案: 1. 对复杂的正则表达式进行简化或优化,避免不必要的重复匹配或回溯操作。 2. 尽量减少待匹配的文本长度,或者通过分块的方式进行匹配,减少单个匹配操作的复杂度。 3. 使用更高效的正则表达式引擎或库,可以选择一些经过性能优化的库来提升匹配速度。 4. 针对具体情况,可以考虑采用其他方法,如字符串操作或自定义解析器等,来代替正则表达式进行文本匹配。 综上所述,正则表达式可能会卡住的原因有多种,解决方法也因情况而异。需要根据具体情况分析和优化,以提高正则表达式的运行效率。 ### 回答3: C运行正则表达式卡住的原因可能有以下几点: 1. 正则表达式本身复杂度高:某些复杂的正则表达式可能会导致运行时间较长。正则表达式引擎需要逐个字符地匹配输入文本,如果正则表达式中包含多个嵌套的量词、回溯、或者复杂的匹配规则,会增加匹配的时间复杂度。 2. 输入文本过长:如果输入的文本非常大,比如几百兆或几个G的文本,正则表达式引擎需要逐个字符地遍历每个字符进行匹配,这样耗时较长,可能导致卡顿。 3. 正则表达式与输入文本不匹配:有时,正则表达式与输入文本不匹配会导致卡住的现象。正则表达式引擎会尝试所有可能的匹配,当正则表达式无法匹配到整个输入文本时,可能会进入无限循环或者时间复杂度较高的模式,造成运行卡住。 解决这个问题的方法可以有以下几种: 1. 优化正则表达式:简化或重写复杂的正则表达式,减少回溯和匹配次数,使用更高效的匹配语法。 2. 分割输入文本:如果输入文本过长,可以考虑将文本分割成小块逐个进行正则表达式匹配,降低时间复杂度。 3. 使用其他方法替代正则表达式:对于某些场景,可以考虑使用字符串处理函数或其他更高效的方式替代正则表达式匹配。 总之,正则表达式运行卡住可能是由于正则表达式本身复杂度高、输入文本过长或正则表达式与文本不匹配等原因造成的。要解决这个问题,可以优化正则表达式、分割文本或者使用其他方式替代正则表达式匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值