新聞中心
先來看一個(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