PHP の通常のキャプチャ グループと非キャプチャ グループ
PHP正则中的捕获组与非捕获组
今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中出现的问题。
什么是捕获组
我们先看一下PHP的正则匹配函数
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
前面两项是我们常用的,$pattern是正则匹配模式,$string是要匹配的字符串。
array &$match,它是一个数组,&表示匹配出来的结果会被写入$match中。
int $flags 如果传递了这个标记, 对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。
int $offset 用于指定从目标字符串的某个未知开始搜索(单位是字节)。
我们主要看一下$match的值里会有什么:
<span style="color: #800080;">$mode</span> = '/a=(\d+)b=(\d+)c=(\d+)/'<span style="color: #000000;">;</span><span style="color: #800080;">$str</span>='**a=4b=98c=56**'<span style="color: #000000;">;</span><span style="color: #800080;">$res</span>=<span style="color: #008080;">preg_match</span>(<span style="color: #800080;">$mode</span>,<span style="color: #800080;">$str</span>,<span style="color: #800080;">$match</span><span style="color: #000000;">);</span><span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$match</span>);
结果如下:
<span style="color: #0000ff;">array</span> (size=4<span style="color: #000000;">) </span>0 => <span style="color: #0000ff;">string</span> 'a=4b=98c=56' (length=11<span style="color: #000000;">) </span>1 => <span style="color: #0000ff;">string</span> '4' (length=1<span style="color: #000000;">) </span>2 => <span style="color: #0000ff;">string</span> '98' (length=2<span style="color: #000000;">) </span>3 => <span style="color: #0000ff;">string</span> '56' (length=2)
现在我们知道了什么是捕获组,捕获组是正则表达示中以()括起来的部分,每一对()是一个捕获组。
PHP会为它编号,从1开始。至于为什么会从1开始,那是因为PHP把匹配到的完整字符串编号为0。
如果有多个括号或嵌套括号,按左边括号出现的顺序来进行编号,如图:
按图中的匹配模式匹配时,捕获组的123号分别是红绿蓝。
捕获组的忽略与命名
我们还可以阻止PHP为匹配组的编号:在匹配组中模式前加 ?:
$mode = '/a=(\d+)b=(?:\d+)c=(\d+)/';
这样,匹配结果就会变成:
<span style="color: #0000ff;">array</span> (size=3<span style="color: #000000;">) </span>0 => <span style="color: #0000ff;">string</span> 'a=4b=98c=56' (length=11<span style="color: #000000;">) </span>1 => <span style="color: #0000ff;">string</span> '4' (length=1<span style="color: #000000;">) </span>2 => <span style="color: #0000ff;">string</span> '56' (length=2)
当然,我们也可以在括号的内部为它给它独特的名字。
命名子组可以接受(?
), (?'name') 以及(?P )语法. 之前版本仅接受(?P )语法.
例如:$mode = '/a=(\d+)b=(?P
使用时结果为:
<span style="color: #0000ff;">array</span> (size=5<span style="color: #000000;">) </span>0 => <span style="color: #0000ff;">string</span> 'a=4b=98c=56' (length=11<span style="color: #000000;">) </span>1 => <span style="color: #0000ff;">string</span> '4' (length=1<span style="color: #000000;">) </span>'sec' => <span style="color: #0000ff;">string</span> '98' (length=2<span style="color: #000000;">) </span>2 => <span style="color: #0000ff;">string</span> '98' (length=2<span style="color: #000000;">) </span>3 => <span style="color: #0000ff;">string</span> '56' (length=2)
在保留索引数组的同时,加上一个关联项,key值为捕获组名。
捕获组的反向引用
我们在用preg_replace()函数进行正则替换时,我们还可以使用 \n 或 $n 来引用第n个捕获组.
<span style="color: #800080;">$mode</span> = '/a=(\d+)b=(\d+)c=(\d+)/'<span style="color: #000000;">;</span><span style="color: #800080;">$str</span>='**a=4b=98c=56**'<span style="color: #000000;">;</span><span style="color: #800080;">$rp</span>='\1/$2/\3/'<span style="color: #000000;">;</span><span style="color: #0000ff;">echo</span> <span style="color: #008080;">preg_replace</span>(<span style="color: #800080;">$mode</span>,<span style="color: #800080;">$rp</span>,<span style="color: #800080;">$str</span>);<span style="color: #008000;">//</span><span style="color: #008000;">**4/98/56/**</span>
\1表示捕获组1(4),$2为捕获组2(98),\3为捕获组3(56)。
非捕获组的用法:
为什么称为非捕获组呢?那是因为它们有捕获组的特性,在匹配模式的()中,但是匹配时,PHP不会为它们编组,它们只会影响匹配结果,并不作为结果输出。
/d(?=xxx) 匹配"后面是xxx的一个数字"。
注意格式:只能放在匹配模式字符串之后!
例如:
<span style="color: #800080;">$pattern</span>='/\d(?=abc)/'<span style="color: #000000;">;</span><span style="color: #800080;">$str</span>="ab36abc8eg"<span style="color: #000000;">;</span><span style="color: #800080;">$res</span>=<span style="color: #008080;">preg_match</span>(<span style="color: #800080;">$pattern</span>,<span style="color: #800080;">$str</span>,<span style="color: #800080;">$match</span><span style="color: #000000;">);</span><span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$match</span>);<span style="color: #008000;">//</span><span style="color: #008000;">6</span>
匹配的6,因为只有它作为一个数字,后面还有abc。
(?<=xxx) /d 匹配"前面是xxx的一个数字"
注意格式:只能放在匹配模式字符串之前!
例如:
<span style="color: #800080;">$pattern</span>='/(?<=abc)\d/'<span style="color: #000000;">;</span><span style="color: #800080;">$str</span>="ab36abc8eg"<span style="color: #000000;">;</span><span style="color: #800080;">$res</span>=<span style="color: #008080;">preg_match</span>(<span style="color: #800080;">$pattern</span>,<span style="color: #800080;">$str</span>,<span style="color: #800080;">$match</span><span style="color: #000000;">);</span><span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$match</span>);<span style="color: #008000;">//8</span><span style="color: #008000;"><br></span>
匹配的8,因为只有它作为一个数字,后面还有abc。
(?=xxx) (?! を追加します。 🎜>”
の前後の文字列がxxxではないという意味なので例は出しませんここ。
このブログ投稿が役立つと思われる場合は、私を推薦するかフォローしてください。質問がある場合は、以下にメッセージを残してください。ありがとうございます。
ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











ログイン画面に「組織から PIN の変更を求められています」というメッセージが表示されます。これは、個人のデバイスを制御できる組織ベースのアカウント設定を使用しているコンピューターで PIN の有効期限の制限に達した場合に発生します。ただし、個人アカウントを使用して Windows をセットアップした場合、エラー メッセージは表示されないのが理想的です。常にそうとは限りませんが。エラーが発生したほとんどのユーザーは、個人アカウントを使用して報告します。私の組織が Windows 11 で PIN を変更するように要求するのはなぜですか?アカウントが組織に関連付けられている可能性があるため、主なアプローチはこれを確認することです。ドメイン管理者に問い合わせると解決できます。さらに、ローカル ポリシー設定が間違っていたり、レジストリ キーが間違っていたりすると、エラーが発生する可能性があります。今すぐ

Windows 11 では、新鮮でエレガントなデザインが前面に押し出されており、最新のインターフェイスにより、ウィンドウの境界線などの細部をカスタマイズして変更することができます。このガイドでは、Windows オペレーティング システムで自分のスタイルを反映した環境を作成するのに役立つ手順について説明します。ウィンドウの境界線の設定を変更するにはどうすればよいですか? + を押して設定アプリを開きます。 Windows [個人用設定] に移動し、[色の設定] をクリックします。ウィンドウの境界線の色の変更設定ウィンドウ 11" width="643" height="500" > [タイトル バーとウィンドウの境界線にアクセント カラーを表示する] オプションを見つけて、その横にあるスイッチを切り替えます。 [スタート] メニューとタスク バーにアクセント カラーを表示するにはスタート メニューとタスク バーにテーマの色を表示するには、[スタート メニューとタスク バーにテーマを表示] をオンにします。

デフォルトでは、Windows 11 のタイトル バーの色は、選択したダーク/ライト テーマによって異なります。ただし、任意の色に変更できます。このガイドでは、デスクトップ エクスペリエンスを変更し、視覚的に魅力的なものにするためにカスタマイズする 3 つの方法について、段階的な手順を説明します。アクティブなウィンドウと非アクティブなウィンドウのタイトル バーの色を変更することはできますか?はい、設定アプリを使用してアクティブなウィンドウのタイトル バーの色を変更したり、レジストリ エディターを使用して非アクティブなウィンドウのタイトル バーの色を変更したりできます。これらの手順を学習するには、次のセクションに進んでください。 Windows 11でタイトルバーの色を変更するにはどうすればよいですか? 1. 設定アプリを使用して + を押して設定ウィンドウを開きます。 Windows「個人用設定」に進み、

Windows インストーラー ページに「問題が発生しました」というメッセージとともに「OOBELANGUAGE」というメッセージが表示されますか?このようなエラーが原因で Windows のインストールが停止することがあります。 OOBE とは、すぐに使えるエクスペリエンスを意味します。エラー メッセージが示すように、これは OOBE 言語の選択に関連する問題です。心配する必要はありません。OOBE 画面自体から気の利いたレジストリ編集を行うことで、この問題を解決できます。クイックフィックス – 1. OOBE アプリの下部にある [再試行] ボタンをクリックします。これにより、問題が発生することなくプロセスが続行されます。 2. 電源ボタンを使用してシステムを強制的にシャットダウンします。システムの再起動後、OOBE が続行されます。 3. システムをインターネットから切断します。 OOBE のすべての側面をオフライン モードで完了する

タスクバーのサムネイルは楽しい場合もありますが、気が散ったり煩わしい場合もあります。この領域にマウスを移動する頻度を考えると、重要なウィンドウを誤って閉じてしまったことが何度かある可能性があります。もう 1 つの欠点は、より多くのシステム リソースを使用することです。そのため、リソース効率を高める方法を探している場合は、それを無効にする方法を説明します。ただし、ハードウェアの仕様が対応可能で、プレビューが気に入った場合は、有効にすることができます。 Windows 11でタスクバーのサムネイルプレビューを有効にする方法は? 1. 設定アプリを使用してキーをタップし、[設定] をクリックします。 Windows では、「システム」をクリックし、「バージョン情報」を選択します。 「システムの詳細設定」をクリックします。 [詳細設定] タブに移動し、[パフォーマンス] の下の [設定] を選択します。 「視覚効果」を選択します

Windows 11 のディスプレイ スケーリングに関しては、好みが人それぞれ異なります。大きなアイコンを好む人もいれば、小さなアイコンを好む人もいます。ただし、適切なスケーリングが重要であることには誰もが同意します。フォントのスケーリングが不十分であったり、画像が過度にスケーリングされたりすると、作業中の生産性が大幅に低下する可能性があるため、システムの機能を最大限に活用するためにカスタマイズする方法を知る必要があります。カスタム ズームの利点: これは、画面上のテキストを読むのが難しい人にとって便利な機能です。一度に画面上でより多くの情報を確認できるようになります。特定のモニターおよびアプリケーションにのみ適用するカスタム拡張プロファイルを作成できます。ローエンド ハードウェアのパフォーマンスの向上に役立ちます。画面上の内容をより詳細に制御できるようになります。 Windows 11の使用方法

画面の明るさは、最新のコンピューティング デバイスを使用する上で不可欠な部分であり、特に長時間画面を見る場合には重要です。目の疲れを軽減し、可読性を向上させ、コンテンツを簡単かつ効率的に表示するのに役立ちます。ただし、設定によっては、特に新しい UI が変更された Windows 11 では、明るさの管理が難しい場合があります。明るさの調整に問題がある場合は、Windows 11 で明るさを管理するすべての方法を次に示します。 Windows 11で明るさを変更する方法【10の方法を解説】 シングルモニターユーザーは、次の方法でWindows 11の明るさを調整できます。これには、ラップトップだけでなく、単一のモニターを使用するデスクトップ システムも含まれます。はじめましょう。方法 1: アクション センターを使用する アクション センターにアクセスできる

Windows のライセンス認証プロセスが突然切り替わり、このエラー コード 0xc004f069 を含むエラー メッセージが表示されることがあります。ライセンス認証プロセスはオンラインですが、Windows Server を実行している一部の古いシステムではこの問題が発生する可能性があります。これらの初期チェックを実行し、システムのアクティブ化に役に立たない場合は、問題を解決するための主要な解決策に進んでください。回避策 – エラー メッセージとアクティベーション ウィンドウを閉じます。次に、コンピュータを再起動します。 Windows ライセンス認証プロセスを最初から再試行します。解決策 1 – ターミナルからアクティブ化する cmd ターミナルから Windows Server Edition システムをアクティブ化します。ステージ – 1 Windows Server のバージョンを確認する 使用している W の種類を確認する必要があります
