Maison développement back-end tutoriel php Comment les modèles d'expressions régulières font-ils correspondre les chaînes ?

Comment les modèles d'expressions régulières font-ils correspondre les chaînes ?

Nov 30, 2017 am 09:14 AM
匹配 如何 表达式

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

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

逻辑上很容易出错

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

代码复杂难以理解、维护

性能差

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

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

匹配字符串的基本规则

正则匹配、查找与替代

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

匹配字符串的基本规则

1. 匹配固定的字符串

regex e("abc");
Copier après la connexion

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

regex e("abc", regex_constants::icase);
Copier après la connexion

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

regex e("abc.", regex_constants::icase);  // .  Any character except 
newline. 1个字符
Copier après la connexion

4. 匹配0个或1个字符

regex e("abc?");    // ?  Zero or 1 preceding character. 
匹配?前一个字符
Copier après la connexion

5. 匹配0个或多个字符

regex e("abc*");    // *  Zero or more preceding character. 
匹配*前一个字符
Copier après la connexion

6. 匹配1个或多个字符

regex e("abc+");    // +  One or more preceding character. 
匹配+前一个字符
Copier après la connexion

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

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

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

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

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个以下闭区间
Copier après la connexion


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

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

12. 匹配分组

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

13. 匹配子分组

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


14. 匹配某个字符串开头

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


15. 匹配某个字符串结尾

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


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

正则匹配、查找与替代

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

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

bool match = regex_match(str, e);
// 匹配整个字符串str
Copier après la connexion



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

bool match = regex_search(str, e);
// 查找字符串str中匹配e规则的子字符串
Copier après la connexion


但是很多情况下,光是返回一个是否匹配的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;
  }
Copier après la connexion


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

cout << regex_replace(str, e, "$1 is on $2");
Copier après la connexion


此时,会在满足分组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;
}
Copier après la connexion

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

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

相关推荐:

PHP正则表达式合集

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

常用的正则表达式汇总

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide pratique des expressions régulières dans Go : comment faire correspondre les codes de couleur hexadécimaux Guide pratique des expressions régulières dans Go : comment faire correspondre les codes de couleur hexadécimaux Jul 13, 2023 am 10:46 AM

Guide pratique des expressions régulières du langage Go : Comment faire correspondre les codes de couleur hexadécimaux Introduction : Les expressions régulières sont un outil puissant et flexible pour la correspondance de modèles et la recherche de chaînes. Dans le langage Go, nous pouvons utiliser l'expression rationnelle du package d'expressions régulières intégrée pour implémenter ces opérations. Cet article explique comment utiliser des expressions régulières pour faire correspondre les codes de couleur hexadécimaux dans le langage Go. Importation du package d'expressions régulières Tout d'abord, nous devons importer l'expression rationnelle du package d'expressions régulières du langage Go. Vous pouvez ajouter l'instruction d'importation suivante au début du code : i

Expression régulière PHP en action : faire correspondre des lettres et des chiffres Expression régulière PHP en action : faire correspondre des lettres et des chiffres Jun 22, 2023 pm 04:49 PM

Pratique des expressions régulières PHP : correspondance de lettres et de chiffres L'expression régulière est un outil utilisé pour faire correspondre des chaînes, qui peut facilement implémenter la recherche, le remplacement, le fractionnement et d'autres opérations de chaîne. Les expressions régulières sont également un outil très utile dans le développement PHP. Cet article explique comment utiliser les expressions régulières PHP pour faire correspondre les lettres et les chiffres. Faire correspondre un seul caractère Pour faire correspondre un seul caractère, vous pouvez utiliser les classes de caractères dans les expressions régulières. Les classes de caractères sont représentées par des crochets []. Les caractères qu'elles contiennent représentent les caractères pouvant correspondre. Vous pouvez utiliser des tirets pour représenter des plages.

Expressions régulières PHP : correspondance exacte et exclusion des inclusions floues Expressions régulières PHP : correspondance exacte et exclusion des inclusions floues Feb 28, 2024 pm 01:03 PM

Expressions régulières PHP : correspondance exacte et exclusion Les expressions régulières d'inclusion floue sont un puissant outil de correspondance de texte qui peut aider les programmeurs à effectuer une recherche, un remplacement et un filtrage efficaces lors du traitement du texte. En PHP, les expressions régulières sont également largement utilisées dans le traitement des chaînes et la correspondance des données. Cet article se concentrera sur la façon d'effectuer une correspondance exacte et d'exclure les opérations d'inclusion floue en PHP, et l'illustrera avec des exemples de code spécifiques. Correspondance exacte La correspondance exacte signifie faire correspondre uniquement les chaînes qui répondent à la condition exacte, sans aucune variation ni mot supplémentaire.

Conseils de correspondance de chaînes PHP : évitez les expressions incluses ambiguës Conseils de correspondance de chaînes PHP : évitez les expressions incluses ambiguës Feb 29, 2024 am 08:06 AM

Conseils pour la correspondance de chaînes PHP : évitez les expressions incluses ambiguës Dans le développement PHP, la correspondance de chaînes est une tâche courante, généralement utilisée pour rechercher un contenu de texte spécifique ou pour vérifier le format d'entrée. Cependant, nous devons parfois éviter d'utiliser des expressions d'inclusion ambiguës pour garantir l'exactitude de la correspondance. Cet article présentera quelques techniques pour éviter les expressions d'inclusion ambiguës lors de la correspondance de chaînes en PHP et fournira des exemples de code spécifiques. Utilisez la fonction preg_match() pour une correspondance exacte. En PHP, vous pouvez utiliser preg_mat

Comment faire correspondre dans Jedi Submarine 2 Comment faire correspondre dans Jedi Submarine 2 Feb 27, 2024 pm 08:43 PM

Jedi Submarine 2 est un jeu de tir à la troisième personne avec un gameplay de chef-d'œuvre de haute qualité. Il propose un gameplay passionnant qui permet aux amis d'explorer le plaisir opérationnel des batailles de tir en ligne. Le mode en ligne du jeu peut être égalé. Je ne sais toujours pas comment faire fonctionner la correspondance. Dans ce numéro, je partagerai avec vous les étapes de correspondance du didacticiel d'opération de correspondance de Jedi Submarine 2. Réponse : Cliquez sur Quick Match sur l'interface de la planète ! La méthode de correspondance de Jedi Submarine 2. La correspondance rapide de Jedi Submarine 2 est une très bonne fonction. Elle peut aider les joueurs à trouver des coéquipiers avec lesquels s'associer, à participer à une mission ensemble et à coopérer les uns avec les autres pour obtenir une évaluation de mission plus élevée. Les options de correspondance se trouvent sur l'interface de la planète. Lorsque vous recherchez des tâches ou consultez des salles publiques, il y aura une correspondance rapide ci-dessous. Si le joueur active le cross leveling

Existe-t-il un avenir pour l'emploi en pharmacie clinique à l'Université médicale de Harbin ? (Quelles sont les perspectives d'emploi pour la pharmacie clinique à l'Université médicale de Harbin ?) Existe-t-il un avenir pour l'emploi en pharmacie clinique à l'Université médicale de Harbin ? (Quelles sont les perspectives d'emploi pour la pharmacie clinique à l'Université médicale de Harbin ?) Jan 02, 2024 pm 08:54 PM

Quelles sont les perspectives d'emploi de la pharmacie clinique à l'Université médicale de Harbin ? Bien que la situation nationale de l'emploi ne soit pas optimiste, les diplômés en pharmacie ont toujours de bonnes perspectives d'emploi. Dans l'ensemble, l'offre de diplômés en pharmacie est inférieure à la demande. Les sociétés pharmaceutiques et les usines pharmaceutiques sont les principaux canaux d'absorption de ces diplômés. La demande de talents dans l'industrie pharmaceutique augmente également de manière constante. Selon les rapports, ces dernières années, le rapport offre-demande pour les étudiants diplômés dans des domaines tels que les préparations pharmaceutiques et la chimie médicinale naturelle a même atteint 1:10. Direction d'emploi de la majeure en pharmacie clinique : Après l'obtention de leur diplôme, les étudiants se spécialisant en médecine clinique peuvent s'engager dans le traitement médical, la prévention, la recherche médicale, etc. dans les unités médicales et sanitaires, la recherche médicale et d'autres départements. Postes d'emploi : Représentant médical, représentant commercial pharmaceutique, représentant commercial, directeur commercial, directeur régional des ventes, responsable des investissements, chef de produit, spécialiste produit, infirmière

Comment résoudre les erreurs de syntaxe des expressions Python ? Comment résoudre les erreurs de syntaxe des expressions Python ? Jun 24, 2023 pm 05:04 PM

Python, en tant que langage de programmation de haut niveau, est facile à apprendre et à utiliser. Une fois que vous aurez besoin d’écrire un programme Python, vous rencontrerez inévitablement des erreurs de syntaxe, et les erreurs de syntaxe d’expression sont courantes. Dans cet article, nous verrons comment résoudre les erreurs de syntaxe d’expression en Python. Les erreurs de syntaxe d'expression sont l'une des erreurs les plus courantes en Python et elles sont généralement causées par une utilisation incorrecte de la syntaxe ou par des composants nécessaires manquants. En Python, les expressions sont généralement constituées de nombres, de chaînes, de variables et d'opérateurs. le plus courant

Expression régulière PHP : comment faire correspondre toutes les balises textarea en HTML Expression régulière PHP : comment faire correspondre toutes les balises textarea en HTML Jun 22, 2023 pm 09:27 PM

HTML est un langage de balisage de page couramment utilisé pour afficher le contenu des pages Web. En HTML, la balise textarea est utilisée pour créer des zones de texte permettant aux utilisateurs de saisir ou de modifier du texte. Lorsque vous devez extraire toutes les balises textarea et leur contenu d'une page, les expressions régulières PHP peuvent fournir une solution simple et efficace. Dans cet article, nous apprendrons comment faire correspondre toutes les balises textarea en HTML à l'aide d'expressions régulières PHP. Comprendre les tables régulières

See all articles