最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
正則表達(dá)式(C++)(施工中)

先來看一個(gè)例子,要求寫一段代碼,實(shí)現(xiàn)如下功能:

創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元姚安做網(wǎng)站,已為上家服務(wù),為姚安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

從標(biāo)準(zhǔn)輸入中讀取一行字符串, 從中讀取所有郵箱的格式;

對于這個(gè)問題,用傳統(tǒng)的方式是可以解決的:

我們可以用解析字符串的方式實(shí)現(xiàn),需要遍歷一遍獲取的字符串,讀取其中關(guān)鍵的幾個(gè)字符 “.” "@" ".com" 和其中的相關(guān)順序;

C++11支持正則表達(dá)式,利用它可以避免重復(fù)造輪子;

代碼:

#include 
#include 
#include 

int main()
{
	std::string line;
	std::regex email(R"(\w+@(\w+\.)+\w+)");	
	while ( getline(std::cin, line) )
	{
		std::smatch matches;
		auto current = cbegin(line);
		auto last = cend(line);
		while ( current != last )
		{
			if (regex_search(current, last, matches, email))
			{
				std::ssub_match match = matches[0];
				current = match.second;
				std::cout << "[ " << match.str() << " ]" << std::endl;
			} 
			else
			{
				break;
			}
		}
	}
}

——————————————————————

正文:

一、正則表達(dá)式介紹

正則表達(dá)式(regular expression) 是一種描述字符序列的方法,是一種極其強(qiáng)大的計(jì)算工具。C++11中新增了這一特性,在 C++正則表達(dá)式庫(RE庫)中。

PS:RE庫,定義在頭文件 "regex"內(nèi),命名空間:std;

正則表達(dá)式組件:

regex        : 表示有一個(gè)正則表達(dá)式的類;

regex_match     : 將一個(gè)字符序列與一個(gè)正則表達(dá)式匹配;

regex_search     : 尋找第一個(gè)與正則表達(dá)式匹配的子序列;

regex_replace    : 使用給定格式替換一個(gè)正則表達(dá)式;

sregex_iterator    : 迭代器適配器,調(diào)用regex_search 來遍歷一個(gè)string中所有匹配的子串;

smatch         : 容器類,保存在string中搜索的結(jié)果;

ssub_match      : string中匹配的子表達(dá)式的結(jié)果;

接下來簡單介紹幾個(gè)常用的組件:

regex類:

表示一個(gè)正則表達(dá)式。除了初始化和賦值操作,還支持其他的一些操作(后面介紹);

regex_match方法:

確定一個(gè)給定字符序列與一個(gè)給定regex對象是否完全匹配,返回true/false,如果匹配到,將匹配到的內(nèi)容保存起來;

segex_search方法:

確定一個(gè)給定字符序列與一個(gè)給定regex對象是否匹配,只要有部分匹配,就返回true,如果匹配到,將匹配到的部分保存起來;

以上兩個(gè)方法均有2個(gè)重載版本,分別為:

(seq, m, r, mft)
(seq, r, mft)
/*
seq:
待查找的字符串序列,
可以是一個(gè)std::string,或表示范圍的一對迭代器,或一個(gè)指向空字符結(jié)尾的字符數(shù)組的指針

m:
smatch對象,用來保存匹配結(jié)果的相關(guān)細(xì)節(jié)

r:
regex對象,匹配的類型

mft:
(可選) regex_constants::match_flag_type類型,它們會影響匹配過程 (后述)
*/

二、使用RE庫

從上面那幾個(gè)組件的介紹,我們得知:

1、regex類型的對象就是存放要匹配字符串的指定格式,而這個(gè)格式就是所謂的"正則表達(dá)式"了。

默認(rèn)的正則表達(dá)式語言是 ECMAScript,接下來介紹一些常用的ECMAScript語法

    1.1、模式[[::alpha:]] 

       匹配任意字母

    1.2、符號 "+"

       一個(gè)或多個(gè),比如 "[[::alpha:]]+" 表示希望匹配一個(gè)或多個(gè)字母

    1.3、符號"*"

       零個(gè)或多個(gè),比如 "[[::alpha:]]+" 表示希望匹配零個(gè)或多個(gè)字母

2、smatch類型的對象,用來保存所匹配到的字符串1

接下來做一個(gè)小練習(xí): 

有一個(gè)英文單詞的拼寫規(guī)則:"i除非排在c之后,否則必須在e之前";

比如: "freind"、"theif"就不符合這一拼寫規(guī)范,而"recepit" "receive"則符合;

現(xiàn)在要求寫一個(gè)程序,從標(biāo)準(zhǔn)輸入中讀取一行字符串,找出這些不符合規(guī)則的英文單詞。

代碼:

// 查找不在字符c之后的字符串ei
int main()
{
	std::string pattern("[^c]ei");
	/*
	“[^c]”	: 希望匹配不是c的字符
	"[^c]ei"	:想要匹配的上述字符后接ei的字符串
	*/

	// 需要包含pattern的整個(gè)單詞
	pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";
	/*
	前后追加 "[[:alpha:]]*" 表示:與"[^c]ei"模式匹配的完整字符串
	*/

	std::regex r(pattern);	// 構(gòu)造一個(gè)用于查找模式的regex
	std::smatch results;	// 定義一個(gè)對象保存搜索結(jié)果

	// 定義一個(gè)string保存與模式匹配的文本,以及不匹配的文本
	std::string test_str;
	while (getline(std::cin, test_str))
	{
		// 用r在test_str中查找與pattern匹配的子串
		if (regex_search(test_str, results, r))
		{
			std::ssub_match result = results[0];
			std::string ret_str = "[ " + results.str() + " ]";
			std::cout << ret_str << std::endl;
		}
	}
	return 0;
}

_________________________________________________________

指定regex對象的選項(xiàng):

當(dāng)我們定義一個(gè)regex對象,或?qū)σ粋€(gè)regex對象調(diào)用assign為其賦予新值時(shí),可以指定一些標(biāo)志來影響regex如何操作

regex


網(wǎng)站欄目:正則表達(dá)式(C++)(施工中)
文章位置:http://fisionsoft.com.cn/article/jghooe.html