欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C++可以用正則表達(dá)式嗎

本篇內(nèi)容主要講解“C++可以用正則表達(dá)式嗎”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++可以用正則表達(dá)式嗎”吧!

為大興安嶺等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及大興安嶺網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、大興安嶺網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

答案肯定是可以的,那么,今天一個簡單的輸入scanf帶你走進(jìn)正則的世界

#include<stdio.h>
int main()
{
printf("input digate:");
char str[100];
scanf("%[0-9]", str); //輸入123456abc
printf("%s", str); //打印123456
}
       

在scanf時輸入任何一串以數(shù)字開始的字符,那么str里面只會保存字符里面的第一串?dāng)?shù)字

input digate:123456abc
123456
       

先給出一些簡單的正則

限定符含義
%[0-9]數(shù)字集合
%[^0-9]非數(shù)字集合
%[a-zA-Z]字母集合
%[^a-zA-Z]非字母集合

預(yù)熱好了,正題開始...       

若要判斷一個輸入的QQ號是否有效,如何判斷?

判斷步驟:

  1. 長度大于5,小于等于11;
  2. 首位不能為0;
  3. 是否為純數(shù)字?

C++string處理:

#include<iostream>
using namespace std;
int main()
{
string qq = "7466a2063";
if (qq.length() >= 5 && qq.length() <= 11){
// 2. 判斷是否非'0'開頭
if (qq[0] != '0'){
// 3. 判斷是否為純數(shù)字
for each (char var in qq){
cout << var;
if (var < '0' || var > '9'){
cout << "不存在" << endl;
return 0;
}
}
cout << "存在" << endl;
}
else{
cout << "不存在" << endl;
}
}
else{
cout << "不存在" << endl;
}
return 0;
}
       

雖然功能實(shí)現(xiàn)了但是非常麻煩       

正則處理:

#include<iostream>
#include<regex>
using namespace std;
int main()
{
regex qq_reg("[1-9]\\d{4,11}");
string qq = "746632063";
smatch result;
bool ret = regex_match(qq, result, qq_reg);
cout << (ret ? "存在" : "不存在") << endl;
return 0;
}
       

笑出了豬叫,一行正則匹配就解決了

是不是很方便呢?那么接下來便來看看C++如何使用正則表達(dá)式。       

正則程序庫(regex)

「正則表達(dá)式」就是一套表示規(guī)則的式子,專門用來處理各種復(fù)雜的操作。

std::regex是C++用來表示正則表達(dá)式(regular expression)的,于C++11加入,它是class std::basic_regex<>針對char類型的一個特化,還有一個針對wchar_t類型的特化為std::wregex。       

正則文法(regex syntaxes)

std::regex默認(rèn)使用是ECMAScript文法,這種文法比較好用,且威力強(qiáng)大,常用符號的意義如下:

符號意義
^匹配行的開頭
$匹配行的結(jié)尾
.匹配任意單個字符
[…]匹配[]中的任意一個字符
(…)設(shè)定分組
\轉(zhuǎn)義字符
\d匹配數(shù)字[0-9]
\D\d 取反
\w匹配字母[a-z],數(shù)字,下劃線
\W\w 取反
\s匹配空格
\S\s 取反
+前面的元素重復(fù)1次或多次
*前面的元素重復(fù)任意次
?前面的元素重復(fù)0次或1次
{n}前面的元素重復(fù)n次
{n,}前面的元素重復(fù)至少n次
{n,m}前面的元素重復(fù)至少n次,至多m次
|邏輯或

上面列出的這些都是非常常用的符號,靠這些便足以解決絕大多數(shù)問題了。       

匹配(Match)

字符串處理常用的一個操作是匹配,即字符串和規(guī)則恰好對應(yīng),而用于匹配的函數(shù)為std::regex_match(),它是個函數(shù)模板

bool regex_match(string s,regex pattern)
bool regex_match(string s,smatch result,regex pattern)
bool regex_match(s.cbegin()+i,s.cend(),smatch result,regex pattern)  //從字符串的某個位置開始匹配?
      

我們直接來看例子:

#include<iostream>
#include<regex>
using namespace std;
int main()
{
/*匹配*/
regex pattern("^1[3578]\\d{9}$"); //1開頭,后面[3578]中的一個,九個數(shù)字
string s = "17779637570";
smatch result;
bool ismatch = regex_match(s, result, pattern);
if (ismatch)
{
cout << "匹配成功:" << result[0] << endl;
}
else
cout << "匹配失敗" << endl;
return 0;
}
       
匹配成功:17779637570       

匹配成功并返回匹配到的結(jié)果       

搜索(Search)

搜索匹配非常相像,其對應(yīng)的函數(shù)為std::regex_search,也是個函數(shù)模板,用法和regex_match一樣,不同之處在于搜索只要字符串中有目標(biāo)出現(xiàn)就會返回,而非完全匹配。

bool regex_search(string s,regex pattern)
bool regex_search(string s,smatch result,regex pattern)
bool regex_search(s.cbegin()+i,s.cend(),smatch result,regex pattern)  //從字符串的某個位置開始匹配?
       

搜索給定字符串中是否存在與模式匹配的子串,如果存在則返回true。

同樣可以用smatch result記錄結(jié)果,但不同的是result[0]記錄的是整個字符串中從左往右第一個匹配模式的子串。

假如有多個子串符合模式,若想知道result[0]中存儲的是第幾個子串,可以用result.position()函數(shù),返回數(shù)從0開始。

我們直接來看例子:

#include<iostream>
#include<regex>
using namespace std;
int main()
{
regex pattern("\\d+"); /*匹配一個到無窮個數(shù)字*/
string s = "51x41+(5-13/2)x3a";
smatch result;
string::const_iterator iter_begin = s.cbegin();
string::const_iterator iter_end = s.cend();
while (regex_search(iter_begin, iter_end, result, pattern))
{
cout << "查找成功:" << result[0] << endl;
cout << "查找結(jié)果子串的在源串中的迭代器位置" << *result[0].first << endl;
cout << "查找結(jié)果子串的在源串后面的位置" << *result[0].second << endl;
iter_begin = result[0].second; //更新迭代器位置
}
return 0;
}
       
查找成功:51
查找結(jié)果子串的在源串中的迭代器位置5
查找結(jié)果子串的在源串后面的位置x
查找成功:41
查找結(jié)果子串的在源串中的迭代器位置4
查找結(jié)果子串的在源串后面的位置+
查找成功:5
查找結(jié)果子串的在源串中的迭代器位置5
查找結(jié)果子串的在源串后面的位置-
查找成功:13
查找結(jié)果子串的在源串中的迭代器位置1
查找結(jié)果子串的在源串后面的位置/
查找成功:2
查找結(jié)果子串的在源串中的迭代器位置2
查找結(jié)果子串的在源串后面的位置)
查找成功:3
查找結(jié)果子串的在源串中的迭代器位置3
查找結(jié)果子串的在源串后面的位置a
                 

替換(Replace)

最后一種操作稱為替換,即將正則表達(dá)式內(nèi)容替換為指定內(nèi)容regex庫用模板函數(shù)std::regex_replace提供替換操作。

string regex_replace(string s,regex p,string replace_str)//有其他重載用法       

現(xiàn)在,給定一個數(shù)據(jù)為"he...ll..o, worl..d!", 思考一下,如何去掉其中誤敲的“.”?

#include<iostream>
#include<regex>
using namespace std;
int main()
{
char data[] = "he...ll..o, worl..d!";
regex reg("\\."); //正則匹配點(diǎn).
cout << regex_replace(data, reg, ""); //將正則匹配到的點(diǎn)替換成無,即刪除點(diǎn)
return 0;
}
       
hello, world!       

刪除了沒必要的點(diǎn),是不是賊方便...

對字符串data中與模式匹配的所有子串進(jìn)行相應(yīng)的字符串替換,替換字符串引用匹配子串中的內(nèi)容,引用方法如下

轉(zhuǎn)義序列替換為
$n匹配第n個捕捉組的字符串。例如$l表示第一個捕捉組,$2表示第二個,依此類推
$&匹配整個正則表達(dá)式的字符串,等同于$0
$`在源字符串中,在匹配正則表達(dá)式的子字符串左側(cè)的部分
$’在源字符串中,在匹配正則表達(dá)式的子字符串右側(cè)的部分
$$美元符號
#include<iostream>
#include<regex>
using namespace std;
int main()
{
char data[] = "001-Neo,002-Lucia";
regex reg("(\\d+)-(\\w+)");
cout << regex_replace(data, reg, "$1 name=$2");
return 0;
}
          
001 name=Neo,002 name=Lucia

到此,相信大家對“C++可以用正則表達(dá)式嗎”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前題目:C++可以用正則表達(dá)式嗎
文章位置:http://chinadenli.net/article30/pooipo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、品牌網(wǎng)站設(shè)計、企業(yè)網(wǎng)站制作、電子商務(wù)標(biāo)簽優(yōu)化、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)