最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中使用正則匹配問題

 更新時間:2022年11月10日 14:08:54   作者:DeRoy  
這篇文章主要介紹了C++中使用正則匹配問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

C/C++可以用正則表達式嗎?

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

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

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

input digate:123456abc
123456

先給出一些簡單的正則

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

預熱好了,正題開始…

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

判斷步驟:

  • 長度大于5,小于等于11;
  • 首位不能為0;
  • 是否為純數(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;
}

雖然功能實現(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;
}

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

是不是很方便呢?那么接下來便來看看如何使用「正則表達式」。

正則程序庫(regex)

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

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

正則文法(regex syntaxes)

std::regex默認使用是ECMAScript文法,這種文法比較好用,且威力強大,

常用符號的意義如下:

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

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

匹配(Match)

字符串處理常用的一個操作是「匹配」,即字符串和規(guī)則恰好對應,而用于匹配的函數(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)

「搜索」與「匹配」非常相像,其對應的函數(shù)為std::regex_search,也是個函數(shù)模板,用法和regex_match一樣,不同之處在于「搜索」只要字符串中有目標出現(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)

最后一種操作稱為「替換」,即將正則表達式內(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("\\.");?? ?//正則匹配點.
?? ?cout << regex_replace(data, reg, "");?? ?//將正則匹配到的點替換成無,即刪除點
?? ?return 0;
}

hello, world!

刪除了沒必要的點,是不是賊方便…

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

轉(zhuǎn)義序列替換為
$n匹配第n個捕捉組的字符串。例如$l表示第一個捕捉組,$2表示第二個,依此類推
$&匹配整個正則表達式的字符串,等同于$0
$`在源字符串中,在匹配正則表達式的子字符串左側(cè)的部分
$’在源字符串中,在匹配正則表達式的子字符串右側(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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C到C++的升級關系及區(qū)別實例探究

    C到C++的升級關系及區(qū)別實例探究

    這篇文章主要為大家介紹了C到C++的升級關系及區(qū)別實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • c語言如何實現(xiàn)DES加密解密

    c語言如何實現(xiàn)DES加密解密

    這篇文章主要介紹了c語言如何實現(xiàn)DES加密解密問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • C語言重難點之內(nèi)存對齊和位段

    C語言重難點之內(nèi)存對齊和位段

    這篇文章主要介紹了C語言重難點之內(nèi)存對齊和位段,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • visual studio 2015下boost庫配置教程

    visual studio 2015下boost庫配置教程

    這篇文章主要為大家詳細介紹了visual studio 2015下boost庫的配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C++中vector迭代器失效問題詳解

    C++中vector迭代器失效問題詳解

    vector是向量類型,它可以容納許多類型的數(shù)據(jù),如若干個整數(shù),所以稱其為容器,這篇文章主要給大家介紹了關于C++中vector迭代器失效問題的相關資料,需要的朋友可以參考下
    2021-11-11
  • for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8

    for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8

    這篇文章主要介紹了for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8 的相關資料,需要的朋友可以參考下
    2016-07-07
  • C++插件化 NDD源碼的插件機制實現(xiàn)解析

    C++插件化 NDD源碼的插件機制實現(xiàn)解析

    這篇文章主要介紹了C++插件化 NDD源碼的插件機制實現(xiàn)解析,這里再介紹推薦下優(yōu)秀的國產(chǎn)軟件開源項目?NDD(notepad--),一個支持windows/linux/mac的文本編輯器,目標是要國產(chǎn)替換同類軟件,需要的朋友可以參考下
    2023-03-03
  • 使用VS2022開發(fā)在線遠程編譯部署的C++程序(圖文詳解)

    使用VS2022開發(fā)在線遠程編譯部署的C++程序(圖文詳解)

    這篇文章主要介紹了使用VS2022開發(fā)可以在線遠程編譯部署的C++程序,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 基于C語言實現(xiàn)簡單的掃雷游戲

    基于C語言實現(xiàn)簡單的掃雷游戲

    windows自帶的游戲《掃雷》是陪伴了無數(shù)人的經(jīng)典游戲,本文將利用C語言實現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細,感興趣的可以學習一下
    2022-05-05
  • C 語言指針變量的運算詳解

    C 語言指針變量的運算詳解

    本文主要介紹 C語言指針變量運算的知識,這里整理了詳細的知識點,并附示例代碼,有需要學習C語言指針的朋友可以參考下
    2016-08-08

最新評論

荔浦县| 普洱| 澄迈县| 富阳市| 焉耆| 本溪| 东乡族自治县| 融水| 阆中市| 安多县| 黎平县| 金昌市| 盐山县| 谢通门县| 长白| 青神县| 卢湾区| 苏州市| 永宁县| 重庆市| 墨玉县| 怀宁县| 鄢陵县| 平原县| 景泰县| 兴业县| 雷州市| 云林县| 南京市| 黔南| 隆子县| 江油市| 上高县| 永靖县| 平谷区| 土默特左旗| 东山县| 临清市| 霸州市| 肃北| 广河县|