這次帶給大家正規在C++中使用的詳細介紹,正則在C++中使用的注意事項有哪些,下面就是實戰案例,一起來看一下。
正規表示式Regex(regular expression)是一種強大的描述字元序列的工具。在許多語言中都存在著正規表示式,C++11中也將正規表示式納入了新標準的一部分,不僅如此,它還支援了6種不同的正規表示式的語法,分別是:ECMASCRIPT、 basic、extended、awk、grep和egrep。其中ECMASCRIPT是預設的語法,具體使用哪一種語法我們可以在構造正規表示式的時候指定。
正規表示式是文字模式。正規表示式是強大、便利、高效的文字處理工具。正規表示式本身,加上如同一門袖珍程式語言的通用模式表示法(general pattern notation),賦予使用者描述和分析文本的能力。配合上特定工具提供的額外支持,正規表示式能夠新增、刪除、分離、疊加、插入和修整各種類型的文字和資料。
完整的正則表達式由兩種字元構成:特殊字元(special characters)稱為」元字元」(meta characters),其它為」文字」(literal),或為普通文字字元(normal text characters,如字母、數字、漢字、底線)。正規表示式的元字元提供了更強大的描述能力。
和文字編輯器一樣,絕大多數高階程式語言皆支援正規表示式,如Perl、Java、Python、C/C++,這些語言都有各自的正規表示式套件。
正規表示式則僅為一個字串,而它則沒有長度限制。 「子表達式」指的是整個正規表示式中的一部分,通常是括號內的表達式,或是由」|」分割的多選分支。
預設情況下,表達式中的字母是要區分大小寫的。
常用的元字元:
1. 「.」: 符合除"\n"以外的任何單一字元,若要符合包括"\n"在內的任一字符,需使用諸如"[\s\S]"之類的模式;
2. “^”:匹配輸入字符
##########啊串正的開始位置,不匹配任何字符,要匹配”^”字符本身,需使用”\^”;###### 3. “$”:匹配輸入字符串結尾的位置,不匹配任何字符,要匹配”$”字符本身,需使用”\$”;###### 4. “*”: 零次或多次匹配前面的字元或子表達式,”*”等效於”{0,}”,如”\ ^*b」可以符合”b”、”^b”、”^^b”、…;###### 5. “+”: 一次或多次匹配前面的字元或子表達式,等效於”{1,}”,如”a+b”可以匹配”ab”、”aab”、”aaab”、…;###### 6. “?”:零次或一次匹配前面的字符或子表達式,等效於”{0,1}”,如”a[cd]?”可以匹配”a”、”ac”、”ad”; 當此字元緊跟任何其他限定符*” 、”+”、”?”、”{n}”、”{n,}”、”{n,m}”之後時,匹配模式是"非貪心的"。 "非貪心的"模式匹配搜尋到的、盡可能短的字串,而預設的"貪心的"模式匹配搜尋到的、盡可能長的字串。如,在字串"oooo"中,"o+?"只匹配單一"o",而"o+"匹配所有"o";###### 7. 「|」:將兩個符合條件進行邏輯"或"(Or)運算,如正規表示式」(him|her)」符合"itbelongs to him"和"it belongs to her",但是不能符合"itbelongs to them.";###### 8 . “\”: 將下一字元標記為特殊字元、文字、反向引用或八進位轉義符,如,”n”匹配字元”n”,”\n”匹配換行符,序列”\\”匹配”\”,”\(“匹配”(“;###9. 「\w」:依字母或數字或底線,任一個字母或數字或底線,即A~Z,a~z,0~9,_任一個;
10 . 「\W」:符合任意不是字母、數字、底線的字元;
11. 「\s」:符合任意的空格符,包括空格、製表符、換頁符等空白字元的其中任一個,與”[ \f\n\r\t\v]”等效;
12. “\S”:匹配任意不是空格符的字符,與”[^\f\ n\r\t\v]”等效;
13. “\d”:匹配數字,任一個數字,0~9中的任一個,等效於”[0-9]” ;
14. “\D”:符合任意非數字的字符,等效於”[^0-9]”;
15. “\b”: 匹配一個字邊界,即字與空格間的位置,也就是單字和空格之間的位置,不匹配任何字符,如,"er\b"匹配"never"中的"er",但不匹配"verb"中的" er";
16. “\B”: 非字邊界匹配,"er\B"匹配"verb"中的"er",但不匹配"never"中的"er";
17. 「\f」:符合一個換頁符,等價於」\x0c」和」\cL」;
18. 「\n」:符合一個換行符,等價於”\x0a”和”\cJ”;
19. “\r”:匹配一個回車符,等價於”\x0d”和”\cM”;
20 . “\t”:匹配一個製表符,等價於”\x09”和”\cI”;
21. “\v”:匹配一個垂直製表符,等價於”\ x0b”和”\cK”;
22. “\cx”:匹配”x”指示的控製字元,如,\cM匹配Control-M或回車符,”x”的值必須在”A-Z”或”a-z”之間,如果不是這樣,則假定c就是"c"字符本身;
23. “{n}”:”n”是非負整數,正好匹配n次,如,"o{2}"與"Bob"中的"o"不匹配,但與"food"中的兩個"o"匹配;
24. “{n,}”:” n”是非負整數,至少匹配n次,如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有”o”,"o{1,}"等效於"o+","o{0,}"等效於"o*";
25. “{n,m}”:”n”和”m”是非負整數,其中n
26. “x|y”:匹配”x”或”y”,如,”z|food”匹配"z"或"food";”(z|f)ood”匹配"zood"或"food";
27. “[xyz]”:字符集,匹配包含的任一字符,如,"[abc]"匹配"plain"中的"a";
28. “[^xyz]”:反向字符集,匹配未包含的任何字符,匹配除了”xyz”以外的任意字符,如,"[^abc]"匹配"plain"中的"p";
29. “[a-z] 」:字符範圍,匹配指定範圍內的任何字符,如,"[a-z]"匹配"a"到"z"範圍內的任何小寫字母;
30. “ [^a-z]」:反向範圍字符,匹配不在指定的範圍內的任何字符,如,"[^a-z]"匹配任何不在"a"到"z"範圍內的任何字符;
31. “( )”:將”(“和”)”之間的表達式定義為”組”group,並且將匹配這個表達式的字符保存到一個臨時區域,一個正則表達式中最多可以保存9個,它們可以用”\1”到”\9”的符號來引用;
32. “(pattern)”:匹配pattern並捕獲該匹配的子表達式,可以使用$0…$9屬性從結果”匹配”集合中檢索捕獲的匹配;
33. “(?:pattern)”:匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配,这对于用”or”字符” (|)”组合模式部件的情况很有用, 如,”industr(?:y|ies)”是比”industry|industries”更简略的表达式;
34. “(?=pattern)”: 非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始;
35. “(?!pattern)”: 非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows";
要匹配某些特殊字符,需在此特殊字符前面加上”\”,如要匹配字符”^”、”$”、”()”、”[]”、”{}”、”.”、”?”、”+”、”*”、”|”,需使用” \^”、” \$”、” \ (“、”\)”、” \ [“、”\]”、” \{“、”\}”、” \.”、” \?”、” \+”、” \*”、” \|”。
在C++/C++11中,GCC版本是4.9.0及以上,VS版本为VS2013及以上时,会有regex头文件,此头文件中会有regex_match、regex_search、regex_replace等函数可供调用,以下是测试代码:
#include "regex.hpp" #include <regex> #include <string> #include <vector> #include <iostream> int test_regex_match() { std::string pattern{ "\\d{3}-\\d{8}|\\d{4}-\\d{7}" }; // fixed telephone std::regex re(pattern); std::vector<:string> str{ "010-12345678", "0319-9876543", "021-123456789"}; /* std::regex_match: 判断一个正则表达式(参数re)是否匹配整个字符序列str,它主要用于验证文本 注意,这个正则表达式必须匹配被分析串的全部,否则返回false;如果整个序列被成功匹配,返回true */ for (auto tmp : str) { bool ret = std::regex_match(tmp, re); if (ret) fprintf(stderr, "%s, can match\n", tmp.c_str()); else fprintf(stderr, "%s, can not match\n", tmp.c_str()); } return 0; } int test_regex_search() { std::string pattern{ "http|hppts://\\w*$" }; // url std::regex re(pattern); std::vector<:string> str{ "http://blog.csdn.net/fengbingchun", "https://github.com/fengbingchun", "abcd://124.456", "abcd https://github.com/fengbingchun 123" }; /* std::regex_search: 类似于regex_match,但它不要求整个字符序列完全匹配 可以用regex_search来查找输入中的一个子序列,该子序列匹配正则表达式re */ for (auto tmp : str) { bool ret = std::regex_search(tmp, re); if (ret) fprintf(stderr, "%s, can search\n", tmp.c_str()); else fprintf(stderr, "%s, can not search\n", tmp.c_str()); } return 0; } int test_regex_search2() { std::string pattern{ "[a-zA-z]+://[^\\s]*" }; // url std::regex re(pattern); std::string str{ "my csdn blog addr is: http://blog.csdn.net/fengbingchun , my github addr is: https://github.com/fengbingchun " }; std::smatch results; while (std::regex_search(str, results, re)) { for (auto x : results) std::cout str{ "123456789012345678", "abcd123456789012345678efgh", "abcdefbg", "12345678901234567X" }; std::string fmt{ "********" }; /* std::regex_replace: 在整个字符序列中查找正则表达式re的所有匹配 这个算法每次成功匹配后,就根据参数fmt对匹配字符串进行替换 */ for (auto tmp : str) { std::string ret = std::regex_replace(tmp, re, fmt); fprintf(stderr, "src: %s, dst: %s\n", tmp.c_str(), ret.c_str()); } return 0; } int test_regex_replace2() { // reference: http://www.cplusplus.com/reference/regex/regex_replace/ std::string s("there is a subsequence in the string\n"); std::regex e("\\b(sub)([^ ]*)"); // matches words beginning by "sub" // using string/c-string (3) version: std::cout <p>相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!</p> <p>推荐阅读:</p> <p><a href="http://www.php.cn/js-tutorial-390700.html" target="_blank">使用正则表达式提取字符串详解(附代码)</a></p> <p style="text-align: left;"><a href="http://www.php.cn/js-tutorial-390698.html" target="_blank">容易产生错误的js手机号码验证</a><br></p></:string></:string></iostream></vector></string></regex>
以上是正規在C++中使用的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),