正規表現に関する 30 分間の入門チュートリアル
この記事の目標
このチュートリアルの使用方法
正規表現とは正確には何ですか?
入門
正規表現のテスト
メタキャラクター
文字エスケープ
重複
文字クラス
分岐条件
対義語
グループ
後方参照
ゼロ幅アサーション
負のゼロ幅アサーション
注釈
貪欲と怠惰
処理オプション
バランスのとれたグループ/再帰一致します
他に言及されていないことがあります
著者に連絡してください
最後に、いくつかの宣伝...
この記事のオンラインリソースと参考文献
更新記録
バージョン: v2.31 (2009-4-11) 作成者: deerchao 転載の際は出典を明記してください
目次をスキップ
正規表現について理解しましょう30 分で完了し、独自のプログラムや Web ページで使用できるように、基本的な内容を理解します。
最も重要なことは、30分ください。正規表現の経験がない場合は、30秒で始めようとしないでください - 超人的な人でない限り:)
以下の複雑な表現に怖がらないでください。ステップバイステップで従うだけで、正規表現はあなたが思っているほど難しくないことがわかるでしょう。もちろん、このチュートリアルを読んだ後、多くのことは理解できても、ほとんど何も思い出せなかったとしても、それは正常です。これまで正規表現に触れたことのない人でも、このチュートリアルを読んだ後はかなりのことを理解できるようになると思います。チュートリアルでは、記載された文法を 80% 以上覚えられる可能性はゼロです。これは基本原則を理解していただくためのものであり、正規表現を上手にマスターするには、今後さらに練習して使用する必要があります。
この記事は、入門チュートリアルであるだけでなく、日常業務で使用できる正規表現構文のリファレンス マニュアルとしても機能します。著者自身の経験に関する限り、この目標はうまく達成されました。ご存知のとおり、すべてを自分で書き留めることはできませんね。
明確な書式設定 テキスト形式の規則: 技術用語メタキャラクター/文法形式正規表現正規表現の一部(分析用)ペアソース文字列それ一致します 正規表現または正規表現の一部の説明
補足を非表示にする この記事の右側には、主に関連情報を提供するため、またはプログラマの経験がない人向けにいくつかのコメントがあります概念は読者に説明されており、通常は無視してかまいません。
文字は、コンピューターソフトウェアが文字、数字、句読点、スペース、改行、漢字などのテキストを処理する際の最も基本的な単位です。 文字列 は、0 個以上の文字のシーケンスです。 Textはテキスト、文字列です。特定の文字列 が特定の正規表現 に一致するということは、通常、文字列の一部 (またはいくつかの部分) がその式で指定された条件を満たすことができることを意味します。
文字列を処理するプログラムや Web ページを作成する場合、特定の複雑なルールに一致する文字列を検索する必要があることがよくあります。 正規表現 は、これらのルールを記述するために使用されるツールです。言い換えれば、正規表現はテキスト ルールを記録するコードです。
おそらく Windows/Dos でのファイル検索に ワイルドカード、つまり * と ? を使用したことがあるでしょう。特定のディレクトリ内のすべての Word ドキュメントを検索したい場合は、*.doc を検索します。ここで、*は任意の文字列として解釈されます。ワイルドカードと同様に、正規表現もテキストの一致に使用されるツールですが、ワイルドカードよりもニーズを正確に記述することができます。もちろん、複雑になりますが、たとえば、 の検索に使用される正規表現を作成できます。 0 で始まり、2 ~ 3 桁、ハイフン「-」、最後に 7 桁または 8 桁の文字列 (010-12345678 または 0376-7654321 など)。
正規表現を学ぶ最良の方法は、例を理解した後、自分で例を変更して実験することです。以下にいくつかの簡単な例を示し、詳細に説明します。
英語の小説で hi を検索すると仮定すると、正規表現 hi を使用できます。
これは、ほぼ最も単純な正規表現で、次のような文字列と正確に一致します: は 2 つの文字で構成され、最初の文字は h、次の文字は i です。通常、正規表現を処理するツールでは、大文字と小文字を区別しないオプションが提供されます。このオプションがチェックされている場合、hi、HI、Hi、hIthisのいずれかと一致します。 4つの状況。
残念ながら、him、history、highなど、多くの単語にhiという2つの連続した文字が含まれています。 hiを使用して検索すると、hiも見つかります。こんにちはという単語を正確に 検索したい場合は、 /bhi/b を使用する必要があります。
/bは正規表現(まあ、メタキャラクター、メタキャラクターと呼ぶ人もいます)で指定された特別なコードで、単語の始まりか終わり、つまり終わりを表します。言葉の境界線。通常、英語の単語はスペース、句読点、または改行で区切られますが、/b はこれらの単語区切り文字のいずれにも一致せず、 1 つの位置 にのみ一致します。 より正確にする必要がある場合、
/bは、前後の文字が両方とも一致しない位置 (1 つは存在する、もう 1 つは存在しない、または存在しない) /w と一致します。 探しているものが
hi のすぐ後に Lucy である場合、/bhi/b.*/bLucy/b を使用する必要があります。 ここで、
.は別のメタキャラクターであり、改行を除く任意の文字に一致します。 * もメタキャラクターですが、文字や位置ではなく数量を表します。* の前の内容を何度でも再利用して式全体を一致させることができることを指定します 。したがって、 .* を組み合わせると、改行を含まない 任意の数の文字 を意味します。これで /bhi/b.*/bLucy/b の意味は明らかです。 最初は hi という単語、次に任意の数の文字 (ただし改行は不可)、そして最後に Lucy という単語です。 改行文字は「/n」、ASCII エンコード 10 (16 進数 0x0A) の文字です。
他のメタキャラクターを同時に使用すると、より強力な正規表現を構築できます。たとえば、次の例:
0/d/d-/d/d/d/d/d/d/d/d は、次のような文字列と一致します: は 0 で始まり、その後に 2 が続きます数字、次にハイフン「-」、最後に 8 桁 (つまり、中国の電話番号。もちろん、この例は市外局番が 3 桁の状況にのみ一致します)。
ここの /d は、 1 桁 (0、または 1、または 2、または...) に一致する新しいメタキャラクターです。 - はメタキャラクターではなく、それ自体 (ハイフン (またはマイナス記号、ダッシュ、または任意の呼び方)) のみと一致します。
煩わしい繰り返しを避けるために、この式を次のように書くこともできます: 0/d{2}-/d{8}。 ここで、/dの後の{2}({8})は、前の/dを2回(8回)繰り返して一致させる必要があることを意味します 連続です。
その他の利用可能なテストツール:
RegexBuddy
Javascript正規表現オンラインテストツール
正規表現の読み書きが難しくないと感じたら、あなたは天才か、地球人ではないかのどちらかです。正規表現の構文は、定期的に使用している人であっても混乱を招く可能性があります。正規表現は読み書きが難しく、エラーが発生しやすいため、正規表現をテストするツールを見つける必要があります。
正規表現の詳細は、環境によって異なります。このチュートリアルでは、Microsoft .Net Framework 2.0 での正規表現の動作を紹介します。そのため、.Net での Regex Tester と呼ばれるツールを紹介します。まず .Net Framework 2.0 がインストールされていることを確認してから、Regex Tester をダウンロードします。これはグリーン ソフトウェアです。ダウンロード後、圧縮パッケージを開いて RegexTester.exe を直接実行します。
以下は、実行中の Regex Tester のスクリーンショットです:
これで、/b、.、* などのいくつかの便利なメタ文字はすでにわかりました。 、正規表現には、/sスペース、タブ、改行記号、中国語の全角スペースなどの空白文字と一致するなど、さらに多くのメタ文字があります。 。 /wは、の文字、数字、アンダースコア、漢字などと一致します。 中国語/漢字の特殊な処理は、.Net が提供する正規表現エンジンによってサポートされています。他の環境での特定の状況については、関連ドキュメントを確認してください。 さらにいくつか例を示します: /ba/w*/b
は、文字
a
で始まるの単語と一致します - まず単語の先頭 (/b )、次に文字 a、次に任意の数の文字または数字 (/w*)、最後に単語の末尾 (/b)。 さて、正規表現内の単語の意味について話しましょう: 少なくとも 1 つの連続した /w。はい、これは、英語を学ぶときに覚えなければならない同じ名前の何千ものこととはほとんど関係がありません:)
/d+一致1つ以上の連続する数字
。ここで、+は*に似たメタキャラクターですが、違いは、*は何度でも(おそらく0回)繰り返されるに一致するのに対し、+は一致することです。 1回以上繰り返します。 /b/w{6}/bは、ちょうど 6 文字の単語と一致します。
コード | 説明 |
---|---|
. | は改行を除く任意の文字と一致します |
/w | 文字、数字、アンダースコア、または漢字に一致 |
/s | 任意の空白文字に一致 |
/d | 数字を一致させる |
/b | 単語の先頭または末尾と一致します |
^ | 文字列の先頭と一致します |
$ | 文字列の末尾と一致します |
コード/構文 | 説明 |
---|---|
* | 0回以上繰り返す |
+ | 1回以上繰り返します |
? | 0回または1回繰り返します |
{n} | n回繰り返します |
{n,} | n回以上繰り返す |
{n,m} | n回からm回食べる |
ここで、繰り返しの使用例をいくつか示します:
Windows /d+は、Windowsの後に1つ以上の数字が続きます
^/w+は、行の最初の単語と一致します(または文字列全体の最初の単語、一致の具体的な意味はオプション設定によって異なります)
対応する文字メタキャラクターがすでに存在するため、数字、文字または数字、空白を見つけるのは非常に簡単ですセットですが、事前定義されたメタキャラクターを持たない文字セット (母音 a、e、i、o、u など) を照合したい場合はどうすればよいでしょうか?
とても簡単です。[aeiou] は英語の母音に一致します, [.?!]match 句読点 (.それとも!)。
文字範囲を簡単に指定することもできます。[0-9]は/dと全く同じ意味です: 1桁; 同じLi [ a-z0-9A-Z_] も /w と完全に同等です (英語のみを考慮した場合)。
より複雑な式は次のとおりです: /(?0/d{2}[) -]?/d{8}。
「(」と「)」もメタキャラクターですが、後でグループ化セクションで説明するため、ここでエスケープする必要があります。
この式は、(010)88886666、022-22334455、02912345678 など、いくつかの形式の 電話番号 と一致します。 待ってください。これについて分析してみましょう。最初にエスケープ文字 /( があり、これは 0 回または 1 回出現します (?)。次に 0 があり、その後に 2 つの数字 ( /d{2})、次に ) または - または space のいずれかが 1 回出現するかどうか (?) 、そして最後に8 つの数字 (/d{8})。
残念ながら、今の式は 010)12345678 や (022-87654321) などの「間違った」形式にも一致する可能性があります。この問題を解決するには、 を使用する必要があります。 分岐条件 。正規表現内の 分岐条件 は、ルールのいずれかが満たされた場合、一致したものとみなされます。異なるルールがわかりませんか? 大丈夫です。例を見てください: 0/d{2}-/d{8}|0/d{3}-/d{7}
ハイフンで区切られた 2 種類の電話番号を 照合できます。1 つは 3 桁の市外局番と 8 桁の市内番号 (010-12345678 など)、もう 1 つは 4 桁の市外局番と 7 桁の市外局番です。市内番号 (0376-2233445) /(0/d{2}/)[- ]?/d{8}|0/d{2}[- ]?/d{8} この式 は、3 桁の市外局番を持つ電話番号に一致します。市外局番は括弧で囲むことも、括弧で囲まなくても、市外局番と市内局番はハイフンまたはスペースで区切ることもできます。分岐条件を使用してこれを表現することができます。この式は 4 桁の市外局番
もサポートするように拡張されました。/d{5}-/d{4}|/d{5}この式は、米国の郵便番号と一致するために使用されます。米国の郵便番号の規則は 5 桁、またはハイフンで区切られた 9 桁です。この例が挙げられている理由は、次の問題を説明できるためです。 分岐条件を使用するときは、各条件の順序に注意してください。これを /d{5}|/d{5}-/d{4} に変更すると、5 桁の郵便番号 (および 9 桁の郵便番号の最初の 5 桁) のみが表示されます。一致する。その理由は、分岐条件を照合するときに、各条件が左から右にテストされ、特定の分岐が満たされると、他の条件は考慮されないためです。
1 つの文字を繰り返す方法 (文字の直後に修飾子を追加するだけ) についてはすでに説明しましたが、複数の文字を繰り返したい場合はどうすればよいでしょうか。括弧を使用して 部分式 (グループ化とも呼ばれる) を指定し、この部分式の繰り返し数を指定したり、部分式に対して他の操作を実行したりすることもできます (後で紹介します)。 。
(/d{1,3}/.){3}/d{1,3} は、単純な IP アドレス一致式です。この式を理解するには、次の順序で分析してください: /d{1,3} は、 1 ~ 3 桁の数値 , (/d{1,3}/.){ と一致します。 3} 3 桁の数字と英語のピリオド (この全体も グループ ) の一致を 3 回繰り返し 、最後に 1 ~ 3 桁の を追加します ( /d{1 ,3})。 IP アドレスの数字は 255 を超えることはできません。「24」の第 3 シーズンの脚本家に騙されないでください...
残念ながら、これは
256.300.888.999 にも一致します。 この IP アドレスは存在できません。算術比較を使用できる場合は、この問題を簡単に解決できる可能性がありますが、正規表現では数学関数が提供されないため、正しい IP アドレスを記述するには、長いグループ化、選択、および文字クラスのみを使用できます: ( (2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5 ]| [01]?/d/d?)。 この式を理解する鍵は、
2[0-4]/d|25[0-5]|[01]?/d/d?を理解することです。ここでは詳しく説明しません。それはあなた次第です。あなたはその意味を分析できるはずです。
以上が正規表現入門チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。