ホームページ バックエンド開発 PHPチュートリアル 正規表現パターンはどのようにして文字列と一致するのでしょうか?

正規表現パターンはどのようにして文字列と一致するのでしょうか?

Nov 30, 2017 am 09:14 AM
マッチ どうやって 表現

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

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

逻辑上很容易出错

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

代码复杂难以理解、维护

性能差

      看到代码库中有一个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的子串。

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

相关推荐:

PHP正则表达式合集

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

常用的正则表达式汇总

以上が正規表現パターンはどのようにして文字列と一致するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go の正規表現の実践ガイド: 16 進数のカラー コードを一致させる方法 Go の正規表現の実践ガイド: 16 進数のカラー コードを一致させる方法 Jul 13, 2023 am 10:46 AM

Go 言語の正規表現実践ガイド: 16 進数のカラー コードを照合する方法 はじめに: 正規表現は、パターン マッチングと文字列の検索のための強力で柔軟なツールです。 Go 言語では、組み込みの正規表現パッケージ regexp を使用してこれらの操作を実装できます。この記事では、Go 言語で正規表現を使用して 16 進数のカラーコードを照合する方法を紹介します。正規表現パッケージのインポート まず、Go 言語の正規表現パッケージ regexp をインポートする必要があります。コードの先頭に次の import ステートメントを追加できます。

PHP 正規表現の動作: 文字と数字の一致 PHP 正規表現の動作: 文字と数字の一致 Jun 22, 2023 pm 04:49 PM

PHP 正規表現の練習: 文字と数字の照合 正規表現は、文字列の照合に使用されるツールであり、文字列の検索、置換、分割などの操作を簡単に実装できます。正規表現は、PHP 開発においても非常に便利なツールです。この記事では、PHP 正規表現を使用して文字と数字を一致させる方法を紹介します。単一文字の一致 単一文字を一致させるには、正規表現で文字クラスを使用できます。文字クラスは角かっこ [] で表されます。その中の文字は、一致する文字を表します。ハイフン - を使用して範囲を表すことができます。

PHP 正規表現: 厳密な一致とあいまいな包含の除外 PHP 正規表現: 厳密な一致とあいまいな包含の除外 Feb 28, 2024 pm 01:03 PM

PHP 正規表現: 完全一致と除外 ファジー包含正規表現は、プログラマがテキストを処理する際に効率的な検索、置換、フィルタリングを実行できる強力なテキスト マッチング ツールです。 PHP では、正規表現は文字列処理やデータ マッチングにも広く使用されています。この記事では、PHP で完全一致を実行し、あいまい包含操作を除外する方法に焦点を当て、具体的なコード例を使用して説明します。完全一致 完全一致とは、バリエーションや余分な単語ではなく、正確な条件を満たす文字列のみと一致することを意味します。

PHP 文字列マッチングのヒント: あいまいな組み込み式を避ける PHP 文字列マッチングのヒント: あいまいな組み込み式を避ける Feb 29, 2024 am 08:06 AM

PHP 文字列マッチングのヒント: あいまいな組み込み式を避ける PHP 開発では、文字列マッチングは一般的なタスクであり、通常は特定のテキスト コンテンツを検索したり、入力形式を検証したりするために使用されます。ただし、一致の精度を確保するために、曖昧な包含式の使用を避ける必要がある場合があります。この記事では、PHP で文字列マッチングを行うときにあいまいな包含式を回避するためのテクニックをいくつか紹介し、具体的なコード例を示します。完全一致には preg_match() 関数を使用します。 PHP では、preg_mat を使用できます。

Jedi Submarine 2 でのマッチング方法 Jedi Submarine 2 でのマッチング方法 Feb 27, 2024 pm 08:43 PM

Jedi Submarine 2 は、高品質の傑作ゲームプレイを備えたサードパーソン シューティング ゲームです。友達と一緒にオンライン シューティング バトルの操作の楽しさを探索できる、エキサイティングなゲームプレイがたくさんあります。ゲーム内のオンライン モードはマッチング可能です。一部のプレイヤーは私と対戦することができます。マッチングの操作方法がまだわかりません。今回は、ジェダイ サブマリン 2 のマッチング操作チュートリアルを紹介します。回答: 惑星インターフェイスで [クイック マッチ] をクリックします。ジェダイ サブマリン 2 のマッチング方法. ジェダイ サブマリン 2 のクイック マッチングは非常に優れた機能で、プレイヤーが一緒にマッチングするチームメイトを見つけたり、一緒にミッションに参加したり、より高いミッション評価を得るためにお互いに協力したりするのに役立ちます。マッチング オプションはプラネット インターフェースにあります。タスクを探しているとき、またはパブリック ルームを表示しているときは、下にクイック マッチングが表示されます。クリックしてマッチングを開始します。プレイヤーがクロスレベリングをオンにした場合

ハルビン医科大学の臨床薬学への就職に将来はありますか? (ハルビン医科大学の臨床薬学への就職の見通しはどのようなものですか?) ハルビン医科大学の臨床薬学への就職に将来はありますか? (ハルビン医科大学の臨床薬学への就職の見通しはどのようなものですか?) Jan 02, 2024 pm 08:54 PM

ハルビン医科大学の臨床薬学の就職の見通しはどのようなものですか? 全国の雇用情勢は楽観的ではありませんが、薬学部卒業生の就職の見通しは依然として良好です。全体として、薬学部卒業生の供給は需要を下回っており、製薬会社や製薬工場がその卒業生を吸収する主なチャネルとなっており、製薬業界における人材需要も着実に伸びています。報道によると、近年、医薬品製剤や生薬化学などの専攻の大学院生の需給比は1:10に達するケースもあるという。臨床薬学専攻の就職方向:臨床医学専攻の学生は卒業後、医療保健ユニット、医学研究部門等で治療、予防、医学研究等に従事することができます。雇用職種:医薬情報担当者、医薬品営業担当者、営業担当者、営業マネージャー、地域営業マネージャー、投資マネージャー、プロダクトマネージャー、プロダクトスペシャリスト、看護師

Python 式の構文エラーを解決するにはどうすればよいですか? Python 式の構文エラーを解決するにはどうすればよいですか? Jun 24, 2023 pm 05:04 PM

Python は高レベルのプログラミング言語であり、学習と使用が簡単です。 Python プログラムを作成する必要があると、必然的に構文エラーに遭遇することになります。式の構文エラーはよくあるエラーです。この記事では、Python で式の構文エラーを解決する方法について説明します。式の構文エラーは Python で最も一般的なエラーの 1 つであり、通常は構文の間違った使用法や必要なコンポーネントの欠落によって発生します。 Python では、式は通常、数値、文字列、変数、演算子で構成されます。ごくありふれた

PHP 正規表現: HTML 内のすべての textarea タグと一致する方法 PHP 正規表現: HTML 内のすべての textarea タグと一致する方法 Jun 22, 2023 pm 09:27 PM

HTML は、Web ページ上にコンテンツを表示するために一般的に使用されるページ マークアップ言語です。 HTML では、textarea タグは、ユーザーがテキストを入力または編集できるテキスト ボックスを作成するために使用されます。ページからすべての textarea タグとそのコンテンツを抽出する必要がある場合、PHP 正規表現はシンプルで効果的なソリューションを提供します。この記事では、PHP 正規表現を使用して HTML 内のすべての textarea タグを照合する方法を学びます。通常のテーブルを理解する

See all articles