搜尋
首頁後端開發C#.Net教程正規表示式模式符合字串基礎知識_正規表示式

这篇文章主要介绍了正则表达式模式匹配字符串基础知识,分为匹配字符串的基本规则和正则匹配、查找与替代的知识,本文给大家介绍的非常不错,需要的朋友可以参考下

 介绍

      在实际项目中有个功能的实现需要解析一些特定模式的字符串。而在已有的代码库中,在已实现的部分功能中,都是使用检测特定的字符,使用这种方法的缺点是:

  • 逻辑上很容易出错

  • 很容易漏掉对一些边界条件的检查

  • 代码复杂难以理解、维护

  • 性能差

      看到代码库中有一个cpp,整个cpp两千多行代码,有个方法里,光解析字符串的就有400余行!一个个字符对比过去,真是不堪入目。而且上面很多注释都已经过期,很多代码的书写风格也各不相同,基本可以判断是过了很多人手的。

      在这种情况下,基本没办法还沿着这条老路走下去,自然而然就想到了使用正则表达式。而我自己在正则表达式方面没有实际应用的经验,尤其是对于书写匹配规则也是一知半解。第一时间就想到从网上找点资料,先大致了解下。但是度娘的结果依旧还是让人很失望。(当然,如果是想要查找一些比较专业的知识,度娘的结果每次都会让人心碎,无不都是千篇一律的拷贝。但是通常度娘生活方面的还是可以)后来就放弃度娘的查询结果,FQ到了外面去找,也找到了一些比较基础的视频(需FQ)。

      这篇文章可以说是一个总结,把在书写正则表达式的匹配字符串方面的基础知识介绍一下。主要分为以下两个个部分:

  1. 匹配字符串的基本规则

  2. 正则匹配、查找与替代

本文介绍的正则表达式规则是ECMAScript。使用的编程语言是C++。其他方面的不做介绍。

匹配字符串的基本规则

1. 匹配固定的字符串

regex e("abc");

2. 匹配固定字符串,不区分大小写

regex e("abc", regex_constants::icase);

3. 匹配固定字符串之外多一个字符,不区分大小写

regex e("abc.", regex_constants::icase);  // .  Any character except newline. 1个字符

4. 匹配0个或1个字符

regex e("abc?");    // ?  Zero or 1 preceding character. 匹配?前一个字符

5. 匹配0个或多个字符

regex e("abc*");    // *  Zero or more preceding character. 匹配*前一个字符

6. 匹配1个或多个字符

regex e("abc+");    // +  One or more preceding character. 匹配+前一个字符

7. 匹配特定字符串中的字符

regex e("ab[cd]*");    // [...] Any character inside square brackets. 匹配[]内的任意字符

8. 匹配非特定字符串的字符

regex e("ab[^cd]*");    // [...] Any character not inside square brackets. 匹配非[]内的任意字符

9. 匹配特定字符串,且指定数量

regex e("ab[cd]{3}");    // {n}  匹配{}之前任意字符,且字符个数为3个

10. 匹配特定字符串,指定数量范围


regex e("ab[cd]{3,}");  // {n} 匹配{}之前任意字符,且字符个数为3个或3个以上
regex e("ab[cd]{3,5}");  // {n} 匹配{}之前任意字符,且字符个数为3个以上,5个以下闭区间


11. 匹配规则中的某一个规则

regex e("abc|de[fg]");    // |  匹配|两边的任意一个规则

12. 匹配分组

regex e("(abc)de+");    // ()       ()表示一个子分组

13. 匹配子分组


regex e("(abc)de+\\1");  // ()    ()表示一个子分组,而\1表示在此位置匹配第一个分组的内容
regex e("(abc)c(de+)\\2\\1");  // \2 表示的是在此匹配第二个分组的内容


14. 匹配某个字符串开头


regex e("^abc."); 
// ^ begin of the string 查找以abc开头的子字符串


15. 匹配某个字符串结尾


regex e("abc.$");
// $ end of the string 查找以abc结尾的子字符串


      以上是最基本的匹配模式的书写。通常如果要匹配特定的字符,需要使用\进行转义,比如在匹配字符串中需要匹配".",那么在匹配字符串中应该在特定字符前加上\。出了以上的基本规则,如果还不满足特定的需要,那么可以参考此链接。使用了解基本的匹配模式后,需要使用正则表达式进行匹配、查找或者替代。

正则匹配、查找与替代

      书写好模式字符串后,需要将待匹配的字符串和模式字符串进行一定规则的匹配。包括三种方式:匹配(regex_match)、查找(regex_search)、替换(regex_replace)。

      匹配很简单,直接将待匹配字符串和模式字符串传入到regex_match中,返回一个bool量来指明待匹配的字符串是否满足模式字符串的规则。匹配整个str字符串。


bool match = regex_match(str, e);
// 匹配整个字符串str


      查找是在整个字符串中找到和满足模式字符串的子字符串。也就是只要str中存在满足模式字符串就会返回true。


bool match = regex_search(str, e);
// 查找字符串str中匹配e规则的子字符串


      但是很多情况下,光是返回一个是否匹配的bool量是不够的,我们需要拿到匹配的子字符串。那么就需要在模式字符串中将匹配字符串分组,参考【匹配字符串的基本规则】第12点。再将smatch传入到regex_search中,就可以获得满足每个子分组的字符串。


smatch m;
bool found = regex_search(str, m, e);
for (int n = 0; n < m.size(); ++n)
  {
    cout << "m[" << n << "].str()=" << m[n].str() << endl;
  }


    替换也是基于模式字符串在分组情况下完成的。


cout << regex_replace(str, e, "$1 is on $2");


      此时,会在满足分组1和分组2的字符串中间加上“ is on”。

      以上三个函数有很多版本的重载,可以满足不同情况下的需求。

实战

      要求:找出满足sectionA("sectionB")或者sectionA ("sectionB")的模式字符串。且分离出sectionA、sectionB。sectionA和sectionB不会出现数字,字符可大小写,至少有一个字符。

      分析:根据要求,大致可分为两个部分,也就是sectionA和sectionaB。这是就需要用到分组。

第一步:写出满足section情况的模式字符串

[a-zA-Z]+

第二步:在sectionA和sectionB中可能会出现空格。暂且假设至多有1个空格

\\s?

将以上两个情况组合起来,也就是能满足我们需求的模式字符串。但是如何组织才能让其分为两组呢?

[a-zA-Z]+\\s[a-zA-Z]+

上面这种写法肯定不对的,根据分组规则,需要将分组以()进行区分

regex e("([a-zA-Z]+)\\s?\\(\"([a-zA-Z]+)\"\\)");

      此时,在\\s?后面的\\(\"是为了满足sectionB外层的引号和括号进行的转义。

      以上完成后,可先用regex_match进行匹配,如果匹配,那么继续使用regex_search对字符串进行查找


if (regex_match(str, e))
{
 smatch m;
 auto found = regex_search(str, m, e);
 for (int n = 0; n < m.size(); ++n)
 {
 cout << "m[" << n << "].str()=" << m[n].str() << endl;
 }
}
else
{
 cout << "Not matched" << endl;
}


      对象m数组的第一个字符串是满足需求的整个子串,接下来才是满足分组1、分组2的子串。

总结

以上所述是小编给大家介绍的正则表达式模式匹配字符串基础知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对PHP中文网的支持!

相关推荐:

使用正则表达式验证登录页面输入是否符合要求_正则表达式

正则表达式 \w \d 的意义解答

使用正则表达式屏蔽关键字的方法

以上是正規表示式模式符合字串基礎知識_正規表示式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用C#.NET開發:實用指南和示例使用C#.NET開發:實用指南和示例May 12, 2025 am 12:16 AM

C#和.NET提供了強大的功能和高效的開發環境。 1)C#是一種現代、面向對象的編程語言,結合了C 的強大和Java的簡潔性。 2).NET框架是一個用於構建和運行應用程序的平台,支持多種編程語言。 3)C#中的類和對像是面向對象編程的核心,類定義數據和行為,對像是類的實例。 4).NET的垃圾回收機制自動管理內存,簡化開發者的工作。 5)C#和.NET提供了強大的文件操作功能,支持同步和異步編程。 6)常見錯誤可以通過調試器、日誌記錄和異常處理來解決。 7)性能優化和最佳實踐包括使用StringBuild

C#.NET:了解Microsoft .NET框架C#.NET:了解Microsoft .NET框架May 11, 2025 am 12:17 AM

.NETFramework是一個跨語言、跨平台的開發平台,提供一致的編程模型和強大的運行時環境。 1)它由CLR和FCL組成,CLR管理內存和線程,FCL提供預構建功能。 2)使用示例包括讀取文件和LINQ查詢。 3)常見錯誤涉及未處理異常和內存洩漏,需使用調試工具解決。 4)性能優化可通過異步編程和緩存實現,保持代碼可讀性和可維護性是關鍵。

c#.net的壽命:其持久流行的原因c#.net的壽命:其持久流行的原因May 10, 2025 am 12:12 AM

C#.NET保持持久吸引力的原因包括其出色的性能、豐富的生態系統、強大的社區支持和跨平台開發能力。 1)性能表現優異,適用於企業級應用和遊戲開發;2).NET框架提供了廣泛的類庫和工具,支持多種開發領域;3)擁有活躍的開發者社區和豐富的學習資源;4).NETCore實現了跨平台開發,擴展了應用場景。

掌握C#.NET設計模式:從單胎到依賴注入掌握C#.NET設計模式:從單胎到依賴注入May 09, 2025 am 12:15 AM

C#.NET中的設計模式包括Singleton模式和依賴注入。 1.Singleton模式確保類只有一個實例,適用於需要全局訪問點的場景,但需注意線程安全和濫用問題。 2.依賴注入通過注入依賴提高代碼靈活性和可測試性,常用於構造函數注入,但需避免過度使用導致複雜度增加。

現代世界中的C#.NET:應用和行業現代世界中的C#.NET:應用和行業May 08, 2025 am 12:08 AM

C#.NET在現代世界中廣泛應用於遊戲開發、金融服務、物聯網和雲計算等領域。 1)在遊戲開發中,通過Unity引擎使用C#進行編程。 2)金融服務領域,C#.NET用於開發高性能的交易系統和數據分析工具。 3)物聯網和雲計算方面,C#.NET通過Azure服務提供支持,開發設備控制邏輯和數據處理。

C#.NET開發人員社區:資源和支持C#.NET開發人員社區:資源和支持May 06, 2025 am 12:11 AM

C#.NET開發者社區提供了豐富的資源和支持,包括:1.微軟的官方文檔,2.社區論壇如StackOverflow和Reddit,3.GitHub上的開源項目,這些資源幫助開發者從基礎學習到高級應用,提升編程技能。

C#.NET優勢:功能,好處和用例C#.NET優勢:功能,好處和用例May 05, 2025 am 12:01 AM

C#.NET的優勢包括:1)語言特性,如異步編程簡化了開發;2)性能與可靠性,通過JIT編譯和垃圾回收機制提升效率;3)跨平台支持,.NETCore擴展了應用場景;4)實際應用廣泛,從Web到桌面和遊戲開發都有出色表現。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)