正则表达式模式如何匹配字符串?
正则表达式,又称规则表达式。计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。本文我们就和大家分享正则表达式模式匹配字符串的基础知识。
在实际项目中有个功能的实现需要解析一些特定模式的字符串。而在已有的代码库中,在已实现的部分功能中,都是使用检测特定的字符,使用这种方法的缺点是:
逻辑上很容易出错
很容易漏掉对一些边界条件的检查
代码复杂难以理解、维护
性能差
看到代码库中有一个cpp,整个cpp两千多行代码,有个方法里,光解析字符串的就有400余行!一个个字符对比过去,真是不堪入目。而且上面很多注释都已经过期,很多代码的书写风格也各不相同,基本可以判断是过了很多人手的。 在这种情况下,基本没办法还沿着这条老路走下去,自然而然就想到了使用正则表达式。
这篇文章可以说是一个总结,把在书写正则表达式的匹配字符串方面的基础知识介绍一下。主要分为以下两个个部分:
匹配字符串的基本规则
正则匹配、查找与替代
本文介绍的正则表达式规则是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的子串。
以上内容就是正则表达式模式匹配字符串的基础知识,希望对大家有帮助。
相关推荐:
Atas ialah kandungan terperinci 正则表达式模式如何匹配字符串?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Go Language Panduan Praktikal Ungkapan Biasa: Cara Memadankan Kod Warna Heksadesimal Pengenalan: Ungkapan biasa ialah alat yang berkuasa dan fleksibel untuk padanan corak dan mencari rentetan. Dalam bahasa Go, kita boleh menggunakan pakej ekspresi biasa terbina dalam regexp untuk melaksanakan operasi ini. Artikel ini akan memperkenalkan cara menggunakan ungkapan biasa untuk memadankan kod warna heksadesimal dalam bahasa Go. Mengimport pakej ungkapan biasa Pertama, kita perlu mengimport pakej ekspresi biasa regexp bahasa Go. Anda boleh menambah pernyataan import berikut pada permulaan kod: i

Amalan ungkapan biasa PHP: memadankan huruf dan nombor Ungkapan biasa ialah alat yang digunakan untuk memadankan rentetan, yang boleh melaksanakan carian rentetan, penggantian, pemisahan dan operasi lain dengan mudah. Ekspresi biasa juga merupakan alat yang sangat berguna dalam pembangunan PHP. Artikel ini akan memperkenalkan cara menggunakan ungkapan biasa PHP untuk memadankan huruf dan nombor. Memadankan Aksara Tunggal Untuk memadankan aksara tunggal, anda boleh menggunakan kelas aksara dalam ungkapan biasa. Kelas aksara diwakili oleh kurungan segi empat sama []. Aksara di dalamnya mewakili aksara yang boleh dipadankan Anda boleh menggunakan tanda sempang - untuk mewakili julat.

Ungkapan Biasa PHP: Padanan Tepat dan Pengecualian Ungkapan tetap kemasukan kabur ialah alat padanan teks yang berkuasa yang boleh membantu pengaturcara melakukan carian, penggantian dan penapisan yang cekap semasa memproses teks. Dalam PHP, ungkapan biasa juga digunakan secara meluas dalam pemprosesan rentetan dan pemadanan data. Artikel ini akan menumpukan pada cara melakukan pemadanan tepat dan mengecualikan operasi kemasukan kabur dalam PHP dan akan menggambarkannya dengan contoh kod khusus. Padanan tepat Padanan tepat bermaksud padanan hanya rentetan yang memenuhi syarat yang tepat, bukan sebarang variasi atau perkataan tambahan.

Petua Padanan Rentetan PHP: Elakkan Ungkapan Disertakan Kabur Dalam pembangunan PHP, pemadanan rentetan ialah tugas biasa, biasanya digunakan untuk mencari kandungan teks tertentu atau untuk mengesahkan format input. Walau bagaimanapun, kadangkala kita perlu mengelak daripada menggunakan ungkapan kemasukan yang tidak jelas untuk memastikan ketepatan padanan. Artikel ini akan memperkenalkan beberapa teknik untuk mengelakkan ungkapan kemasukan yang samar-samar semasa melakukan pemadanan rentetan dalam PHP dan memberikan contoh kod khusus. Gunakan fungsi preg_match() untuk padanan tepat Dalam PHP, anda boleh menggunakan preg_mat

Jedi Submarine 2 ialah permainan menembak orang ketiga dengan permainan hebat yang berkualiti tinggi. Ia mempunyai banyak permainan menarik yang membolehkan rakan meneroka keseronokan operasi pertempuran menembak dalam talian. Beberapa pemain I masih tidak tahu bagaimana untuk mengendalikan pemadanan. Dalam keluaran ini, saya akan berkongsi dengan anda langkah-langkah padanan tutorial operasi Jedi Submarine 2. Jawapan: Klik Padanan Pantas pada antara muka planet. Kaedah pemadanan Jedi Submarine 2. Pemadanan pantas Jedi Submarine 2 ialah fungsi yang sangat baik Ia boleh membantu pemain mencari rakan sepasukan untuk dipadankan bersama, memasuki misi bersama-sama dan bekerjasama antara satu sama lain untuk mendapatkan penilaian misi yang lebih tinggi. Pilihan padanan adalah pada antara muka planet Apabila mencari tugas atau melihat bilik awam, akan ada padanan pantas di bawah. Jika pemain menghidupkan meratakan silang

Apakah prospek pekerjaan farmasi klinikal di Universiti Perubatan Harbin Walaupun situasi pekerjaan negara tidak optimistik, graduan farmaseutikal masih mempunyai prospek pekerjaan yang baik. Secara keseluruhannya, bekalan graduan farmaseutikal adalah kurang daripada permintaan Syarikat farmaseutikal dan kilang farmaseutikal adalah saluran utama untuk menyerap graduan tersebut. Menurut laporan, dalam beberapa tahun kebelakangan ini, nisbah bekalan-permintaan untuk pelajar siswazah dalam jurusan seperti persediaan farmaseutikal dan kimia perubatan semula jadi telah mencapai 1:10. Arah pekerjaan jurusan farmasi klinikal: Selepas tamat pengajian, pelajar jurusan perubatan klinikal boleh melibatkan diri dalam rawatan perubatan, pencegahan, penyelidikan perubatan, dsb. dalam unit perubatan dan kesihatan, penyelidikan perubatan dan jabatan lain. Jawatan pekerjaan: Wakil perubatan, wakil jualan farmaseutikal, wakil jualan, pengurus jualan, pengurus jualan wilayah, pengurus pelaburan, pengurus produk, pakar produk, jururawat

Python, sebagai bahasa pengaturcaraan peringkat tinggi, mudah dipelajari dan digunakan. Sebaik sahaja anda perlu menulis program Python, anda pasti akan menghadapi ralat sintaks, dan ralat sintaks ungkapan adalah perkara biasa. Dalam artikel ini, kita akan membincangkan cara menyelesaikan ralat sintaks ungkapan dalam Python. Ralat sintaks ungkapan adalah salah satu ralat yang paling biasa dalam Python, dan ia biasanya disebabkan oleh penggunaan sintaks yang salah atau kehilangan komponen yang diperlukan. Dalam Python, ungkapan biasanya terdiri daripada nombor, rentetan, pembolehubah dan pengendali. paling biasa

HTML ialah bahasa penanda halaman yang biasa digunakan untuk memaparkan kandungan pada halaman web. Dalam HTML, tag textarea digunakan untuk membuat kotak teks yang membolehkan pengguna memasukkan atau mengedit teks. Apabila anda perlu mengekstrak semua teg textarea dan kandungannya daripada halaman, ungkapan biasa PHP boleh memberikan penyelesaian yang mudah dan berkesan. Dalam artikel ini, kita akan belajar cara memadankan semua teg textarea dalam HTML menggunakan ungkapan biasa PHP. Fahami jadual biasa
