Rumah pembangunan bahagian belakang tutorial php 正则表达式模式如何匹配字符串?

正则表达式模式如何匹配字符串?

Nov 30, 2017 am 09:14 AM
perlawanan bagaimana ungkapan

正则表达式,又称规则表达式。计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。本文我们就和大家分享正则表达式模式匹配字符串的基础知识。

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

逻辑上很容易出错

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

代码复杂难以理解、维护

性能差

      看到代码库中有一个cpp,整个cpp两千多行代码,有个方法里,光解析字符串的就有400余行!一个个字符对比过去,真是不堪入目。而且上面很多注释都已经过期,很多代码的书写风格也各不相同,基本可以判断是过了很多人手的。  在这种情况下,基本没办法还沿着这条老路走下去,自然而然就想到了使用正则表达式。

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

匹配字符串的基本规则

正则匹配、查找与替代

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

匹配字符串的基本规则

1. 匹配固定的字符串

regex e("abc");
Salin selepas log masuk

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

regex e("abc", regex_constants::icase);
Salin selepas log masuk

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

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

4. 匹配0个或1个字符

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

5. 匹配0个或多个字符

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

6. 匹配1个或多个字符

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

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

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

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

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

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个以下闭区间
Salin selepas log masuk


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

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

12. 匹配分组

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

13. 匹配子分组

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


14. 匹配某个字符串开头

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


15. 匹配某个字符串结尾

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


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

正则匹配、查找与替代

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

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

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



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

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


但是很多情况下,光是返回一个是否匹配的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;
  }
Salin selepas log masuk


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

cout << regex_replace(str, e, "$1 is on $2");
Salin selepas log masuk


此时,会在满足分组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;
}
Salin selepas log masuk

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

以上内容就是正则表达式模式匹配字符串的基础知识,希望对大家有帮助。

相关推荐:

PHP正则表达式合集

php正则表达式中常用函数的详解

常用的正则表达式汇总

Atas ialah kandungan terperinci 正则表达式模式如何匹配字符串?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Praktikal untuk Ungkapan Biasa dalam Go: Cara Memadankan Kod Warna Heksadesimal Panduan Praktikal untuk Ungkapan Biasa dalam Go: Cara Memadankan Kod Warna Heksadesimal Jul 13, 2023 am 10:46 AM

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

Ungkapan biasa PHP dalam tindakan: memadankan huruf dan nombor Ungkapan biasa PHP dalam tindakan: memadankan huruf dan nombor Jun 22, 2023 pm 04:49 PM

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 kemasukan kabur Ungkapan biasa PHP: padanan tepat dan pengecualian kemasukan kabur Feb 28, 2024 pm 01:03 PM

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 Petua Padanan Rentetan PHP: Elakkan Ungkapan Disertakan Kabur Feb 29, 2024 am 08:06 AM

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

Bagaimana untuk memadankan dalam Jedi Submarine 2 Bagaimana untuk memadankan dalam Jedi Submarine 2 Feb 27, 2024 pm 08:43 PM

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

Adakah terdapat masa depan untuk pekerjaan dalam farmasi klinikal di Universiti Perubatan Harbin? (Apakah prospek pekerjaan untuk farmasi klinikal di Universiti Perubatan Harbin?) Adakah terdapat masa depan untuk pekerjaan dalam farmasi klinikal di Universiti Perubatan Harbin? (Apakah prospek pekerjaan untuk farmasi klinikal di Universiti Perubatan Harbin?) Jan 02, 2024 pm 08:54 PM

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

Bagaimana untuk menyelesaikan ralat sintaks ungkapan Python? Bagaimana untuk menyelesaikan ralat sintaks ungkapan Python? Jun 24, 2023 pm 05:04 PM

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

Ungkapan Biasa PHP: Bagaimana untuk memadankan semua teg textarea dalam HTML Ungkapan Biasa PHP: Bagaimana untuk memadankan semua teg textarea dalam HTML Jun 22, 2023 pm 09:27 PM

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

See all articles