正規表現チュートリアルでの繰り返しマッチングの詳細説明

高洛峰
リリース: 2017-01-09 16:01:55
オリジナル
1577 人が閲覧しました

この記事の例では、正規表現チュートリアルの繰り返しマッチングについて説明します。参考のために皆さんと共有してください。詳細は次のとおりです。

注: すべての例では、正規表現の一致結果がソース テキストの [and] の間に含まれています。一部の例は Java を使用して実装されます。 Java 自体の正規表現 式の使用法については該当箇所で説明します。すべての Java サンプルは JDK1.6.0_13 でテストされています。

1. 一致は何回ありますか?

前の記事では 1 つの文字の一致について説明しましたが、1 つの文字または文字のセットを複数回一致させる必要があります。たとえば、電子メール アドレスを一致させたい場合、前述の方法を使用して、w@w.w のような正規表現を作成する可能性がありますが、これは a@b.c のようなアドレスにのみ一致します。これは明らかに間違っています。 次に、その方法を見てみましょう。メールアドレスを照合します。

まず、電子メール アドレスの構成を知る必要があります。つまり、英数字またはアンダースコアで始まり、@ 記号、ドメイン名が続く文字のグループ、つまりユーザー名@ドメイン名アドレスです。ただし、これは特定の電子メール サービス プロバイダーによっても異なります。ユーザー名に . 文字を使用できる場合もあります。

1. 1 つ以上の文字と一致します

同じ文字 (または文字のセット) の複数の繰り返しと一致するには、その文字 (または文字のセット) に接尾辞として + 文字を追加するだけです。 +1 つ以上の文字 (少なくとも 1 つ) と一致します。たとえば、a は a 自体に一致し、a+ は 1 つ以上の連続する a に一致します。[0-9]+ は複数の連続する数字に一致します。

注: + 接尾辞を文字セットに追加する場合、+ は文字セットの外側に配置する必要があります。そうしないと、繰り返し一致しません。たとえば、[0-9+] は数値または + 記号を表します。これは文法的には正しいですが、私たちが望むものではありません。

テキスト: こんにちは、mhmyqn@qq.com または mhmyqn@126.com が私のメールアドレスです。

正規表現: w+@(w+.)+w+

結果: こんにちは、【mhmyqn@qq.com】 または 【 mhmyqn @126.com] は私のメールです。

分析: w+ は 1 つ以上の文字に一致し、部分式 (w+.)+ は xxxx.edu. のような文字列に一致しますが、最後の文字は一致しません。 , したがって、その後に w+ が続きます。 mhmyqn@xxxx.edu.cn のような電子メール アドレスも照合されます。

2. 0 個以上の文字に一致する

0 個以上の文字に一致するには、メタ文字 * を使用します。その使用方法は、文字または文字セットの後に置くだけです (または文字の集合)。文字) が連続して 0 回以上出現します。たとえば、正規表現 ab*c は、ac、abc、abbbbc などに一致します。

3. 0 個または 1 個の文字と一致する

0 個または 1 個の文字と一致するには、メタ文字 ? を使用します。前の記事で述べたように、正規表現 rnrn は空白行の一致に使用されますが、Unix と Linux では r は必要ないため、Windows ではメタ文字 ?、r?nr?n を空白行の一致に使用できます。 Unix および Linux の空白行と一致するだけでなく。 http または https プロトコルに一致する URL の例を見てみましょう:

テキスト: URL は http://www.mikan.com です。安全に接続するには https://www.mikan.cominstead を使用してください。式:https?://(w+.)+w+

結果:URLは【http://www.mikan.com】ですが、安全に接続するには【https://www.mikan.com】を使用してください

分析: このパターンは https? で始まります。これは、? の前の文字が存在する場合と存在しない場合があるため、http または https に一致する可能性があることを意味します。次の部分は前の例と同じです。

2. 正規表現内の一致する繰り返しの数

+、*、および ? は多くの問題を解決しますが、:

1) + と * によって一致する文字数に上限はありません。一致する文字の最大数を設定する方法はありません。

2) +、*、および ? は少なくとも 1 つまたはゼロの文字に一致します。一致する文字の最小数を別の値に設定することはできません。

3) * と + のみを使用する場合、それらが一致する文字数を正確な数に設定することはできません。

正規表現は、繰り返しの数を設定するための構文を提供します。繰り返しの数は、{ と } 文字を使用して指定し、それらの間に値を記述する必要があります。

1. 繰り返される一致の数の正確な値を設定します

繰り返される一致の数の正確な値を設定したい場合は、{ と } の間に数値を書き込むだけです。たとえば、{4} は、元のテキスト内でその前の文字 (または文字セット) が 4 回繰り返されていなければ一致とみなされないことを意味します。3 回しか出現しない場合は、一致とみなされません。

ページ上の色の一致の例について以前の記事で述べたように、#[[:xdigit:]]{6} または #[0-9a-fA-F]{ のように、繰り返しの数を使用して一致させることができます。 6} 、Java の POSIX 文字は #\p{XDigit}{6} です。

2. 反復一致数の間隔を設定する

{} 構文を使用して、反復一致数の間隔を設定することもできます。つまり、反復一致数の最小値と最大値を設定します。このような間隔は、{n, m} の形式で指定する必要があります (n>=m>=0)。たとえば、日付形式が正しいかどうかを確認するための正規表現 (日付の有効性は確認せずに) (日付 2012-08-12 または 2012-8-12 など): d{4}-d{1, 2}-d{1, 2}。

3. 少なくとも何回試合を繰り返す必要がありますか?

{} 構文の最後の使用法は、少なくとも 3 回の繰り返しを示す {3,} など、最小繰り返し数 (ただし、必ずしも最大繰り返し数ではありません) を指定することです。注: {3,} にはカンマが必要です。カンマの後にスペースを入れることはできません。そうしないと、何か問題が発生します。

例を見てみましょう。正規表現を使用して $100 を超えるすべての金額を検索します。

正規表現: $d{3 ,}。 d{2}

結果:

$25.36

【$125.36】

【$205.0】

【$2500.44】

$44.30

+、*、? は繰り返しの数として表すことができます:

+同等のイン{1,}

* は {0,}

と同等ですか? 過剰一致を防止します

は、{n} と { n, m} にも一致する繰り返しの回数には上限がありますが、*、+、{n,} には上限がないため、場合によっては過剰一致が発生します。

HTML タグのマッチングの例を見てみましょう

テキスト:

昨日は 歴史、明日は ミステリー、しかし今日は ;gift< ;/b>.

正規表現: <[Bb]>.*

結果:

昨日は【履歴、明日はミステリー、しかし今日はギフト]。

分析: <[Bb]>はと一致します(大文字と小文字は区別されません)。 < ;/[Bb]> は と一致します (大文字と小文字は区別されません)。しかし、結果は予想どおり 3 つではありません。最初の
タグから最後の までが一致します。

なぜこれが起こっているのですか? * と + は両方とも貪欲なメタ文字であるため、一致するときの動作パターンは、テキストの先頭から最後までではなく、テキストの先頭から末尾までを一致させるために最善を尽くします。最初の一致が見つかりました。

この貪欲な動作が必要ない場合は、これらのメタキャラクターの遅延バージョンを使用できます。遅延とは、貪欲とは対照的に、できるだけ少ない文字を一致させることを意味します。遅延メタ文字は、貪欲メタ文字に ? 接尾辞を追加するだけで済みます。以下は、貪欲なメタキャラクターの遅延バージョンです:

* *?

+ +?

{n,} {n,}?

したがって、上記の例では、正規表現を < に変更するだけで済みます。 ; [Bb]>.*? 結果は次のようになります:

history

mystery

; Gift

IV. 概要

正規表現の真の威力は、一致の繰り返しの数に反映されます。ここでは、+、*、? などのいくつかのメタ文字の使用法を紹介します。一致の数を正確に判断したい場合は、{} を使用します。メタキャラクタには、貪欲と遅延の 2 種類があります。過剰な一致を防ぐ必要がある場合は、正規表現を作成するために遅延メタキャラクタを使用してください。位置合わせについては次回の記事で紹介します。

この記事が皆さんの正規表現の学習に役立つことを願っています。

その他の正規表現チュートリアルや繰り返し一致の詳細な説明、および関連記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!