热爱互联网

C++11 正则表达式

先看这个入个门:http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438191.html

然后详见:http://en.cppreference.com/w/cpp/regex

正则表达式的符号功能见百度百科:http://baike.baidu.com/view/94238.htm

还要考虑支持unicode字符,需要使用wstring,下面regex_match的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <regex>
#include <string>
 
 
int main()
{
	std::locale::global(std::locale(""));
	std::wcout.imbue(std::locale());
 
	std::wstring resource = L"哈哈,I love you 就是我爱你的意思!!!";
 
	std::wstring patternStr;   // 例如: ".*就是我.*的意思.*" 或 ".*" 可以匹配 resource
 
	while( std::wcin >> patternStr )
	{
		const std::wregex pattern(patternStr);  // 把 patternStr 作为一个正则表达式在 resource 中去匹配
 
		if( std::regex_match(resource,pattern) )
		{
			std::wcout << L"成功匹配---" << patternStr << "---" << std::endl;
		}
		else
		{
			std::wcout << L"不匹配---" << patternStr << "---" << std::endl;
		}
	}
 
	return 0;
}

下面判断一个字符串中是否存在一个指定的子串,这个子串在程序被当做正则表达式处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <string>
#include <regex>
 
/***************************************************************
Description: 判断字符串 wsResource 中是否存在 wsPattern 这样的子表达式
Input:  字符串 wsResource 和 正则表达式 wsPattern
Output:
Return:  若存在则返回 true, 否则返回 false
Others:
****************************************************************/
 
bool ExistSubExpression(const std::wstring& wsResource,const std::wstring& wsPattern)
{
	std::wregex pattern(L".*"+wsPattern+L".*"); // 前缀和后缀可以为'n'之外的任何字符
	return std::regex_match(wsResource,pattern);
}
 
 
int main()
{
	std::locale::global(std::locale(""));
	std::wcout.imbue(std::locale());
 
	std::wstring wsResource = L"哈哈,I love you 就是我爱你的意思!!!";
 
	std::wstring wsPattern;
	wchar_t pTemp[50];
 
	while( std::wcin.getline(pTemp,50) )   // 这样就可以包含空格在wsPattern中
	{
		wsPattern.assign(pTemp);
 
	//	std::wcout << wsPattern << std::endl;
	//	std::wcout << pTemp << std::endl;
 
		if ( ExistSubExpression(wsResource,wsPattern) )
		{
			std::wcout << L"存在---" << wsPattern << std::endl;
		}
		else
		{
			std::wcout << L"不存在---" << wsPattern << std::endl;
		}
	}
 
 
	return 0;
}

Post a Comment

Your email is kept private. Required fields are marked *