国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++ 正則表達式的應用詳解

C++ 正則表達式的應用詳解

2022-03-03 14:03自首的小偷 C/C++

正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等

一、為什么要學正則表達式

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

判斷步驟:

  • 長度大于5,小于等于10;
  • 首位不能為0;
  • 是否為純數字?

 

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. 判斷是否為純數字
          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;
}

雖然功能實現了但是非常麻煩

#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++如何使用正則表達式

 

二、正則程序庫(regex)

C++11 新增了正則表達式的標準庫支持,本文簡介 C++ 正則表達式的使用: std::regex是C++用來表示正則表達式(regular expression)的庫,它是class std::basic_regex<>針對char類型的一個特化,還有一個針對wchar_t類型的特化為std::wregex。文檔介紹

C++ 正則表達式的應用詳解

正則文法:

C++ 正則表達式的應用詳解

正則庫:

regex

表示有一個正則表達式類,比如:regex pattern("(.{3})(.{2})_(\d{4})!")

regex_match

全文匹配,要求整個字符串符合正則表達式的匹配規則。用來判斷一個字符串和一個正則表達式是否模式匹配,返回一個 bool 值,true 為匹配,false 為不匹配。匹配的含義是目標字符串必須完全和正則表達式相匹配,不能有多余的字符,如果需要部分匹配則應使用regex_search regex_search 搜索匹配,根據正則表達式來搜索字符串中是否存在符合規則的子字符串。 能和正則表達式相匹配就返回true

regex_replace

替換匹配,即可以將符合匹配規則的子字符串替換為其他字符串。要求輸入一個正則表達式,以及一個用于替換匹配子字符串的格式化字符串。這個格式化字符串可以通過轉義序列引用匹配子字符串中的部分內容

sregex_iterator

迭代器適配器,調用regex_search來遍歷一個string中所有匹配的子串

smatch/match_results

容器類,保存在string中搜索的結果。如果匹配成功,這些函數將成功匹配的相關信息保存在給定的smatch對象中。比如:smatch results;將匹配結果存放在results中,另一種存儲方法聲明:match_resultsstring::const_iterator result

匹配(Match)

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

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)

參數s為要匹配的字符串,pattern為匹配規則,result保存結果s.cbegin()+i,s.cend()對應s的匹配s迭代器所取的范圍。

更多的時候我們希望能夠獲得匹配結果(字符串),對結果進行操作。這時就需要對匹配結果進行存儲,共有兩種存儲方式。

match_resultsstring::const_iterator result;

smatch result; //推薦

如果需要保存結果,可以用第二種函數,用smatch result保存結果。通常result[0]保存整個匹配結果,result[i]保存第i個捕獲組的匹配結果,即模式中第i個括號的匹配結果。如果沒有這樣的結果則為空。可以用result.size()查看一共有多少個匹配結果。

#include<iostream>
#include<regex>
using namespace std;
int main()
{
	string str = "Hello_2021";
	smatch result;
	regex pattern("(.{5})_(\\d{4})");	//匹配5個任意單字符 + 下劃線 + 4個數字

	if (regex_match(str, result, pattern))
	{
		cout << result[0] << endl;		//完整匹配結果,Hello_2018
		cout << result[1] << endl;		//第一組匹配的數據,Hello
		cout << result[2] << endl;		//第二組匹配的數據,2018
		cout << "結果顯示形式2" << endl;
		cout << result.str() << endl;	//完整結果,Hello_2018
		cout << result.str(1) << endl;	//第一組匹配的數據,Hello
		cout << result.str(2) << endl;	//第二組匹配的數據,2018
	}

	//遍歷結果
	for (int i = 0; i < result.size(); ++i)
	{
		cout << result[i] << endl;
	}

}

result結構為如下圖,result[0]為匹配的字符串,result[1]為Hello result[2]為2021

C++ 正則表達式的應用詳解

result[]與result.str()這兩種方式能夠獲得相同的值,我更喜歡用數組形式的。在匹配規則中,以括號()的方式來劃分組別,實例中的規則共有兩個括號,所以共有兩組數據

搜索(Search)

搜索與匹配非常相像,其對應的函數為std::regex_search,也是個函數模板,用法和regex_match一樣,不同之處在于搜索只要字符串中有目標出現就會返回,而非完全匹配。

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) //從字符串的某個位置開始匹配?

string str = "Hello 2018, Bye 2017";
smatch result;
regex pattern("\\d{4}");	//匹配四個數字

//迭代器聲明
string::const_iterator iterStart = str.begin();
string::const_iterator iterEnd = str.end();
string temp;
while (regex_search(iterStart, iterEnd, result, pattern))
{
	temp = result[0];
	cout << temp << " ";
	iterStart = result[0].second;	//更新搜索起始位置,搜索剩下的字符串
}

輸出結果:2018 2017

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

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

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

替換(Replace)

replace是替換匹配,即可以將符合匹配規則的子字符串替換為其他字符串。

string regex_replace(string s,regex p,string replace_str)

string str = "Hello_2021!";
regex pattern("Hello");	
cout << regex_replace(str, pattern, "") << endl;	
cout << regex_replace(str, pattern, "Hi") << endl;	

到此這篇關于C++ 正則表達式的應用詳解的文章就介紹到這了,更多相關C++ 正則表達式內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_50408340/article/details/121504159

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 红桃成人少妇网站 | 欧美一级欧美三级在线观看 | 人人爱人人草 | 99re国产| 五月婷婷在线视频 | 久久久国产视频 | 97在线观看 | 国产小视频在线播放 | 中文字幕一区在线观看视频 | 一区二区三区中文字幕 | 国产精品成人av | 成人高清网站 | 91精品久久久久久久久久 | 国产综合精品一区二区三区 | 午夜电影| 免费看一区二区三区 | 欧美日韩综合视频 | 免费在线看污网站 | 黄色a视频 | 亚洲一区二区三区四区五区中文 | 激情欧美一区二区三区中文字幕 | 国产在亚洲 线视频播放 | 亚洲视频自拍 | av免费网站在线观看 | 亚洲人成网亚洲欧洲无码 | 国产精品久久久久久久久久东京 | 亚洲国产成人av好男人在线观看 | 在线一区观看 | 羞羞的视频在线免费观看 | 久久99精品久久久久久6194 | 中文字幕第二十六页页 | 精品久久电影 | 丁香五月亚洲综合在线 | 国产激情久久久久久 | a级在线免费视频 | 国内精品一级毛片国产99 | 91精品久久久久久久久 | 亚洲三区在线观看 | 久久久精品久久久 | 欧美不卡 | 欧美激情视频一区二区三区在线播放 |