溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

正則表達(dá)式 (C++) (施工中)

發(fā)布時(shí)間:2020-08-18 12:19:03 來源:網(wǎng)絡(luò) 閱讀:1070 作者:shangluyi 欄目:編程語言

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

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


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

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

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

代碼:

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

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對(duì)象是否完全匹配,返回true/false,如果匹配到,將匹配到的內(nèi)容保存起來;

segex_search方法:

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

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

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

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

r:
regex對(duì)象,匹配的類型

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



二、使用RE庫


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

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

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

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

       匹配任意字母


    1.2、符號(hào) "+"

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


    1.3、符號(hào)"*"

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


2、smatch類型的對(duì)象,用來保存所匹配到的字符串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è)對(duì)象保存搜索結(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對(duì)象的選項(xiàng):

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


regex



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI