C++11 正则表达式——实例3

本文介绍了一个使用C++实现的日期格式转换程序。该程序利用正则表达式将日期从‘日/月/年’或其他常见格式转换为‘年月日’的标准格式,适用于不同输入格式的数据处理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <regex>
#include <iostream>
#include <string>

//格式化日期
void format_date(void);






int main()
{
	format_date();


	return 0;

}

std::string format_date(const std::string& date)
{

	// regular expression
	const std::regex pattern("(\\d{1,2})(\\.|-|/)(\\d{1,2})(\\.|-|/)(\\d{4})");

	// transformation pattern, reverses the position of all capture groups
	std::string replacer = "$5$4$3$2$1";

	// apply the tranformation
	return std::regex_replace(date, pattern, replacer);

}

//格式化日期
void format_date(void)
{

	std::string date1 = "1/2/2008";
	std::string date2 = "12.08.2008";
	std::cout << date1 << " -> " << format_date(date1) << std::endl;
	std::cout << date2 << " -> " << format_date(date2) << std::endl;
	std::cout << std::endl;
	return;

	/*
	1/2/2008 -> 2008/2/1
	12.08.2008 -> 2008.08.12

	请按任意键继续. . .
	*/
}

### 如何在 C++ 中使用正则表达式 C++C++11 起提供了对正则表达式的原生支持,这使得开发者可以方便地处理字符串匹配、查找和替换等问题。要使用正则表达式功能,需包含 `<regex>` 头文件并利用 `std::regex` 及其相关类和函数。 #### 基本概念 正则表达式是一种用于描述字符模式的强大工具,在 C++ 中可以通过 `std::regex` 来定义这些模式。常见的基本符号包括: - `^`: 表示字符串的开头[^1]。 - `$`: 表示字符串的结尾。 - `[]`: 定义一个字符集合。 - `{}`: 指定重复次数。 - `()`:分组操作符。 以下是几个常用的正则表达式函数及其作用: - **`std::regex_match`**: 判断整个目标字符串是否完全匹配给定的正则表达式[^2]。 - **`std::regex_search`**: 查找是否存在部分子串能够匹配指定的正则表达式。 - **`std::regex_replace`**: 替换符合特定正则表达式的子串。 #### 示例代码展示 以下是一些具体的实例来说明如何应用上述理论: ##### 示例 1: 简单匹配 此程序检测输入文本中是否有单词以字母 &#39;W&#39; 开始,并由若干个小写字母组成。 ```cpp #include <iostream> #include <regex> int main() { std::string text = "Hello, World!"; // 定义正则表达式模式 std::regex pattern("W[a-z]+"); // 使用 std::regex_search 进行匹配 if (std::regex_search(text, pattern)) { std::cout << "Pattern found in the text." << std::endl; } else { std::cout << "Pattern not found in the text." << std::endl; } return 0; } ``` 这段代码展示了如何创建一个简单的正则对象并通过它执行搜索操作。 ##### 示例 2: 整体匹配验证 如果希望确认某段文字严格遵循某种格式,则可采用如下方式实现全字串匹配测试。 ```cpp #include <iostream> #include <regex> bool validateEmail(const std::string& email) { const std::regex pattern(R"(^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)"); return std::regex_match(email, pattern); } int main(){ std::vector<std::string> emails{"example@example.com", "bademail@com"}; for(auto&& e : emails){ if(validateEmail(e)){ std::cout<<e<<" is valid.\n"; } else{ std::cout<<e<<" is invalid.\n"; } } return 0; } ``` 这里我们构建了一个更复杂的电子邮件地址校验器,其中运用到了原始字符串语法(即前缀 R),以便更容易编写复杂而清晰的正则表达式[^3]。 ##### 示例 3: 字符串替换 假设我们需要把所有数字替换成星号(*),那么可以用到 `std::regex_replace`. ```cpp #include <iostream> #include <regex> using namespace std; int main(){ string s="abc123def456ghi789jkl"; cout<<regex_replace(s,std::regex("[0-9]"),"*")<<"\n"; return 0; } // 输出结果应为 abc***def***ghi***jkl ``` 以上三个例子分别演示了不同场景下正则表达式的实际用途——从简单存在性判断至高级数据清洗任务皆有所涉猎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值