ASP.NET の正規表現

 

クラッシュ コース

スティーブン A. スミス

2004 年 3 月

適用対象:
   Microsoft® .NET Framework
   Microsoft® ASP.NET
   正規表現 API

概要: 正規表現は、テキストを操作するための非常に便利なツールです。 ユーザー入力を検証する必要がある場合でも、文字列内のパターンを検索する必要がある場合でも、テキストの書式を強力な方法で再フォーマットする必要がある場合でも、正規表現が役立ちます。 (14ページ印刷)

この記事のソース コードをダウンロードします

内容

はじめに
正規表現の簡単な履歴
単純な式
量指定子
メタ 文字
文字クラス
定義済みの Set メタ文字
式のサンプル
ASP.NET での検証
正規表現 API
無料ツール
高度なトピック
まとめ
リソース
著者について

はじめに

Microsoft® .NET Framework での正規表現のサポートは第一級であり、Microsoft® ASP.NET 内でも正規表現の言語に依存するコントロールがあります。 この記事では、基本について説明し、詳細を確認する場所を推奨します。

この記事は、正規表現の経験がほとんどまたはまったくない初心者向けに設計されていますが、.NET での ASP.NET とプログラミングに精通しています。 正規表現 チートシートと組み合わせて、以前に正規表現を使用した開発者のための便利なリファレンス/リフレッシャーを作ることを願っています。 この記事では、次について説明します。

  1. 正規表現の簡単な履歴
  2. 単純な式
  3. 量指定子
  4. メタ 文字
  5. 文字クラス
  6. 定義済みの Set メタ文字
  7. サンプル式の詳細
  8. ASP.NET での検証
  9. 正規表現 API
  10. 無料ツール
  11. 高度なトピックの概要
  12. 概要と追加のリソース

この記事や正規表現全般について質問がある場合は、 の正規表現メーリング リストhttp://aspadvice.comで質問してください。この記事を書いていると、サブスクライバーは 350 人を超えます。

正規表現の簡単な履歴

現在の正規表現は1950年代に発明されました。 正規表現は、もともと神経生理学者によって研究されているパターンである「定期的なセット」を記述するために使用されました。 最初の正規表現のクレジットは、数学者の Stephen Kleene に与えられる。 最終的に、Ken Thompson は、非常に一般的なテキスト ユーティリティである qed と grep に正規表現のサポートを構築しました。 ジェフリー・フリードルは、彼の本「マスター正規表現(第2版)」に詳しく取り組みます。これは、正規表現の背後にある理論と歴史の詳細を学ぶことを望む人に強くお勧めします。

過去 50 年間で、正規表現は、数学のあいまいさから、多くのツールやソフトウェア パッケージの主な機能に徐々に移行してきました。 正規表現は何十年もの間、多くの UNIX ツールによってサポートされていましたが、ほとんどの Windows 開発者のツールキットへの道を見つけたのは過去 10 年かそれ以上でした。 Microsoft Visual Basic® 6 または Microsoft®® VBScript で正規表現を使用するのは難しいものでしたが、.NET Frameworkの導入により、正規表現のサポートは一流であり、すべての Microsoft 開発者とすべての .NET 言語で利用できます。

では、正規表現とは何でしょうか? 正規表現は、文字列内のパターンを明示的に記述するために使用できる言語です。 このようなパターンを記述するだけでなく、正規表現エンジンは通常、一致を反復処理したり、パターンを区切り記号として使用して文字列を部分文字列に解析したり、インテリジェントな方法でテキストを置換または再フォーマットしたりするために使用できます。 これらは、テキスト操作に関連する多くの一般的なタスクを解決するための強力で、通常は非常に簡潔な方法を提供します。

正規表現について説明する場合は、一致するテキストに基づいて正規表現を分析するのが一般的です。 この記事 (および System.Text.RegularExpressions クラス) では、正規表現の相互作用で、正規表現パターン、入力文字列、および文字列内のパターン一致する 3 つのプレーヤーを参照します。

単純な式

最も単純な正規表現は、既に使い慣れているリテラル文字列です。 特定の文字列は、文字どおり単独で記述できます。したがって、 foo のような正規表現パターンは、入力文字列 foo と完全に 1 回一致します。 この場合は、入力にも一致します。 食品は非常においしいので、正確な一致だけを求める場合は望ましくないかもしれません。

もちろん、正確な文字列を自分自身に一致させることは正規表現の簡単な実装であり、その力を明らかにし始めるわけではありません。 fooの代わりに、文字fから始まるすべての単語、または3つの文字の単語をすべて見つけたいと思ったらどうなりますか? ここでは、リテラル文字列でできること (理由の範囲内) を超えました。正規表現について詳しく学習します。 次に、リテラル式のサンプルと、一致する入力をいくつか示します。

Pattern 入力 (一致)
foo foo,食べ物,足,「足には悪があります。

量指定子

量指定子は、パターン内で特定の文字または文字セットの繰り返しが許可される回数を簡単に指定する方法を提供します。 明示的でない量指定子は 3 つあります。

  1. *"0 回以上の出現回数" を表す 。
  2. +、"1 回以上の出現回数" を表し、
  3. ?、 は "0 または 1 の出現" を表します。

量指定子は常に、量指定子の直前 (左側) のパターンを参照します。これは、パターン グループを作成するためにかっこを使用しない限り、通常は 1 文字です。 一致するサンプル パターンと入力を次に示します。

Pattern 入力 (一致)
fo* foo, foe, food, fooot, "forget it", funny, puffy
fo+ foo, foe, food, foot, "forget it"
fo? foo, foe, food, foot, "forget it", funny, puffy

指定されたパターンが正確に 0 または 1 回発生する可能性があることを指定することに加えて、 ? 文字は、入力文字列内の複数の文字と一致する可能性がある場合に、パターンまたはサブパターンに最小文字数を強制的に一致させます。

明示的でない量指定子 (通常は量指定子と呼ばれますが、この次のグループと区別しています) に加えて、 明示的な 量指定子もあります。 量指定子がパターンの出現回数に関してかなりあいまいな場合、明示的な量指定子を使用すると、正確な数値、範囲、または一連の数値を指定できます。 明示的な量指定子は、通常の量指定子と同様に、適用されるパターンに従って配置されます。 明示的な量指定子は、中かっこ内の {} 上限と下限の出現制限に中かっこと数値を使用します。 たとえば、 x{5} は 5 つの x 文字 (xxxxx) と完全に一致します。 1 つの数値のみを指定した場合、4 より大きい任意の数の x 文字と一致する x{5,} などのコンマが続く場合を除き、上限として使用されます。 一致するサンプル パターンと入力を次に示します。

Pattern 入力 (一致)
ab{2}c abbc、aaabbccc
ab{,2}c ac、abc、abbc、aabbcc
ab{2,3}c abbc、abbbc、aabbcc、aabbbcc

メタ 文字

特別な意味を持つ正規表現内のコンストラクトは、メタ文字と呼ばれます。 、?+、、{} 文字など*、いくつかのメタ文字について既に学習しました。 他のいくつかの文字は、正規表現の言語内で特別な意味を持ちます。 これには、 $ ^ が含まれます。[ ( | ) ]\

natvis ファイルには、 (ピリオドまたはドット) メタ文字は、最も単純で最も使用されるメタ文字の 1 つです。 任意の 1 文字に一致します。 これは、特定のパターンに任意の文字の組み合わせを含めることができるが、量指定子を使用して特定の長さの範囲内に収まる必要があることを指定する場合に役立ちます。 また、式は、より大きな文字列内で記述されるパターンの任意のインスタンスと一致することを見てきましたが、パターンを正確に一致させるだけの場合はどうなりますか? これは、多くの場合、ユーザーが郵便番号や電話番号に適した形式を入力したことを確認するなど、検証シナリオの場合です。 メタ文字は ^ 文字列 (または行) の先頭を指定するために使用され、 $ メタ文字は文字列 (または行) の末尾を指定するために使用されます。 パターンの先頭と末尾にこれらの文字を追加することで、パターンと完全に一致する入力文字列のみに強制的に一致させることができます。 メタ文字は ^ 、文字クラスの先頭で使用される場合にも特別な意味を持ち、ハード中かっこ [ ] で指定されます。 これらは以下で説明します。

\ (円記号) メタ文字は、特殊な意味から文字を "エスケープ" する場合や、定義済みのセット メタ文字のインスタンスを指定するために使用されます。 これらも以下で説明します。 正規表現にメタ文字のリテラル バージョンを含めるには、バックスラッシュを使用して "エスケープ" する必要があります。 したがって、たとえば、"c:\" で始まる文字列を一致させる場合^ c:\\ を使用する可能性があります。文字列がこのパターンで始まる必要があることを示すためにメタ文字を使用 ^ し、リテラル円記号を円記号メタ文字でエスケープしました。

| (パイプ) メタ文字は、基本的にパターン内で 'this OR that' を指定するために、代替に使用されます。 そのため 、a|b のようなものは、'a' または 'b' が含まれるものに一致し、文字クラス [ab] とよく似ています。

最後に、かっこ ( ) を使用してパターンをグループ化します。 これは、量指定子を使用して完全なパターンを複数回発生させたり、読みやすくしたり、入力の特定の部分を個別に照合したりするために、再フォーマットや解析を可能にするために行うことができます。

メタ文字の使用例をいくつか次に示します。

Pattern 入力 (一致)
. a、b、c、1、2、3
.* Abc、123、任意の文字列、一致する文字がなくても
^C:\\ c:\windows、c:\\\\\、c:\foo.txt、c:\その後に他のもの
abc$ abc、123abc、abc で終わる任意の文字列
(abc){2,3} abcabc、abcabcabc

文字クラス

文字クラスは、正規表現内のミニ言語であり、外側のハードかっこ [ ] で定義されます。 最も単純な文字クラスは、[ aeiou] などのこれらの中かっこ内の文字のリストです。 式で使用する場合、パターン内のこの位置でこれらの文字のいずれかを使用できます (ただし、量指定子を使用しない限り 1 つだけ)。 文字クラスを使用して単語やパターンを定義することはできず、1 文字のみであることに注意してください。

数字を指定するには、文字クラス [0123456789] を 使用できます。 ただし、これはすぐに面倒になるため、ハイフン文字 を使用して中かっこ内で文字 -の範囲を定義できます。 ハイフン文字は、正規表現内ではなく、文字クラス内で特別な意味を持ち(したがって、正規表現メタ文字として正確には修飾されません)、文字クラス内で最初の文字でない場合にのみ特別な意味を持ちます。 ハイフンを使用して数字を指定するには、[ 0-9] を使用します。 同様に、小文字の場合は [a-z]、または任意の大文字 [A-Z] を使用できます。 ハイフンで定義される範囲は、使用されている文字セットによって異なるため、(たとえば) ASCII または Unicode テーブルで文字が出現する順序によって、範囲に含まれる文字が決まります。 範囲にハイフンを含める必要がある場合は、最初の文字として指定します。 たとえば、[ -.? ] は 、これら 4 文字のいずれかと一致します (最後の文字はスペースであることに注意してください)。 また、正規表現メタ文字は文字クラス内では特別に扱われないため、エスケープする必要はありません。 文字クラスは、独自のルールと構文を使用して、正規表現の世界の残りの部分とは別の言語であると考えてください。

文字クラスの最初の文字としてカラット ^ を使用してクラスを否定することで、文字クラスのメンバーを除く任意の文字と一致させることもできます。 したがって、母音以外の文字と一致するには、[ ^aAeEiIoOuU] の文字クラスを使用できます。 ハイフンを否定する場合は、[ ^-] のように、文字クラスの 2 番目の文字にする必要があることに注意してください。 は、正規表現パターンの開始時とは、文字クラス内でまったく異なる意味を持つ点 ^ に注意してください。

動作中の文字クラスの例をいくつか次に示します。

Pattern 入力 (一致)
^b[aeiou]t$ バット、ベット、ビット、ボット、
^[0-9]{5}$ 11111, 12345, 99999
^C:\\ c:\windows、c:\\\\\、c:\foo.txt、c:\その後に他のもの
abc$ abc、123abc、abc で終わる任意の文字列
(abc){2,3} abcabc、abcabcabc
^[^-][0-9]$ 0, 1, 2, ... (-0、-1、-2 などと一致しません)

次のバージョンの.NET Frameworkでは、コード名が "Whidbey" で、文字クラスの減算と呼ばれる文字クラスに新しい機能が追加される予定です。 基本的に、これにより、1 つの文字クラスを別の文字クラスから減算できます。これにより、いくつかのパターンをより読みやすい方法で記述できます。 仕様は、 で https://www.gotdotnet.com/team/clr/bcl/TechArticles/techarticles/Specs/Regex/CharacterClassSubtraction.doc使用できるようになりました。構文は、すべての小文字の子音に一致する [a-z-[aeiou]] のようになります。

定義済みの Set メタ文字

これまでに取り上げたツールを使用して、多くのことを行うことができます。 ただし、パターン内のすべての数字に 対して [0-9] を 使用するか、さらに悪いことに、任意の英数字に対して [0-9a-zA-Z] を 使用すると、まだ長い時間がかかります。 これらの一般的で長いパターンを扱う際の痛みを和らげるために、定義済みのメタ文字のセットが定義されました。 正規表現の実装によって、定義済みのメタ文字の異なるセットが定義されます。ここで説明するものは、.NET Frameworkの System.Text.RegularExpressions API でサポートされています。 これらの定義済みのメタ文字の標準構文は、円記号 \ の後に 1 つ以上の文字が続きます。 これらのほとんどは 1 文字の長さであり、使いやすく、長い文字クラスに最適な置き換えです。 このような 2 つの例は、任意の数字に一致する \d と、任意の単語文字 (英数字とアンダースコア) に一致する \w です。 例外は、Unicode 復帰文字と一致する \u000D など、一致する文字のアドレスを指定する必要がある特定の文字コードの一致です。 最も一般的な文字クラスとそのメタ文字クラスの一部を以下に示します。

メタ 文字 同等の文字クラス
\a ベル (アラーム) と一致します。\u0007
\b 文字クラス を除く 単語の境界に一致し、バックスペース文字 \u0008 と一致します
\t タブと一致します。\u0009
\r キャリッジ リターンと一致します。\u000D
\w 垂直タブと一致します。\u000B
\f フォーム フィードと一致します。\u000C
\n 新しい行と一致します。\u000A
\e エスケープと一致します。\u001B
\040 3 桁の 8 進数の ASCII 文字と一致します。 \040 はスペース (10 進数 32) を表します。
\x20 2 桁の 16 進数を使用して ASCII 文字と一致します。 この場合、\x2- はスペースを表します。
\Cc ASCII コントロール文字 (この場合は ctrl + C) と一致します。
\u0020 4 桁の 16 進数を使用して Unicode 文字と一致します。 この場合、\u0020 はスペースです。
\* 定義済みの文字クラスを表さない文字は、その文字として扱われるだけです。 したがって \*\x2A と同じです (* メタ文字ではなく、リテラル *)。
\p{name} 名前付き文字クラス 'name' の任意の文字と一致します。 サポートされている名前は、Unicode グループとブロック範囲です。 たとえば、Ll、Nd、Z、IsGreek、IsBoxDrawing、Sc (通貨) などです。
\P{name} 名前付き文字クラス 'name' に含まれていないテキストと一致します。
\w 単語に使用される任意の文字と一致します。 Unicode および ECMAScript 以外の実装の場合、これは [a-zA-Z_0-9] と同じです。 Unicode カテゴリでは、これは [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}] と同じです。
\W \w の否定は、ECMAScript 準拠セット [^a-zA-Z_0-9] または Unicode 文字カテゴリ [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}] と等しくなります。
\s 空白文字と一致します。 Unicode 文字クラス [\f\n\r\t\v\x85\p{Z}] と同じです。 ECMAScript に準拠した動作が ECMAScript オプションで指定されている場合、\s は [\f\n\r\t\v] と同じです (先頭のスペースに注意してください)。
\S 空白以外の文字と一致します。 Unicode 文字カテゴリ [^\f\n\r\t\v\x85\p{Z}] と同じです。 ECMAScript に準拠した動作が ECMAScript オプションで指定されている場合、\S は [^ \f\n\r\t\v] と同じです (^の後のスペースをメモします)。
\d 10 進数字と一致します。 Unicode の 場合は [\p{Nd}] 、Unicode 以外の ECMAScript 動作の場合 は [0-9] と同等です。
\D 10 進数以外の数字と一致します。 Unicode の 場合は [\P{Nd}] 、Unicode 以外の ECMAScript 動作の 場合は [^0-9] と同等です。

式のサンプル

ほとんどの人は例によって最もよく学習するので、次に示すのは非常に少数のサンプル式です。 その他のサンプルについては、 のオンライン正規表現ライブラリに http://RegexLib.comアクセスする必要があります。

Pattern 説明
^\d{5}$ 5 桁の数字 (米国の郵便番号など)。
^(\d{5})|(\d{5}-\d{4}$ 5 桁の数字、または 5 桁のダッシュから 4 桁の数字。 これは、US ZIP または US ZIP+4 形式と一致します。
^(\d{5})(-\d{4})?$ 以前と同じですが、より効率的です。 使用。 パターンの -4 桁の部分を省略可能にする場合は、2 つの個別のパターンを個別に比較する必要はありません (代替を使用)。
^[+-]?\d+(\.\d+)?$ 任意の符号を持つ任意の実数と一致します。
^[+-]?\d*\.?\d*$ 上記と同じですが、空の文字列にも一致します。
^(20|21|22|23|[01]\d)[0-5]\d$ 任意の 24 時間の時刻値と一致します。
/\*.*\*/ C スタイルのコメント /* ... の内容と一致します。 */

ASP.NET での検証

ASP.NET には一連の検証コントロールが用意されており、従来の ASP (または必要に応じて クラシック ) を使用する同じタスクと比較して、Web フォームでの入力の検証が非常に簡単になります。 より強力な検証コントロールの 1 つは RegularExpressionValidator です。これは、ご想像のとおり、入力に一致する必要がある正規表現を指定することで入力を検証できます。 正規表現パターンは、コントロールの ValidationExpression プロパティを設定することによって指定されます。 郵便番号フィールドの検証コントロールの例を次に示します。

<asp:RegularExpressionValidator runat="server" id="ZipCodeValidator" 
ControlToValidate="ZipCodeTextBox" ErrorMessage="Invalid ZIP code 
format; format should be either 12345 or 12345-6789."  
ValidationExpression="(\d{5}(-\d{4})?" />

RegularExpressionValidator について注意すべき点がいくつかあります。

  • 検証中のコントロール内の空の文字列によってアクティブになることはありません。 RequiredFieldValidator のみが空の文字列をキャッチします
  • 文字列の先頭と文字列の末尾を一致する文字 (^$) を指定する必要はありません。これらは想定されます。 それらを追加しても、何も傷つけない (または変更される) ことはありません。単に不要です。
  • すべての検証コントロールと同様に、検証はクライアント側とサーバー側で行われます。 正規表現が ECMAScript に準拠していない場合は、クライアントで失敗します。 これを回避するには、式が ECMAScript に準拠していることを確認するか、サーバーでのみ検証を実行するようにコントロールを設定します。

正規表現 API

ASP.NET 検証コントロールの外部では、ほとんどの場合、.NET で正規表現を使用する場合は、 System.Text.RegularExpressions 名前空間にあるクラスを使用します。 特に、使い慣れたメインクラスは、RegexMatchMatchCollection です。

なお、正規表現の短縮バージョンである regex を /reg-eks/ または /rej-eks/ と発音する必要があるかどうかについては、いくつかの議論があります。 個人的には後者が好きですが、両方の発音キャンプに専門家がいるので、どちらが良い音を選ぶか選んでください。

Regex クラスには、豊富なメソッドとプロパティのセットがあります。これは、以前に使用したことがない場合は、かなり困難な場合があります。 最も頻繁に使用されるメソッドの概要を次に示します。

Method 説明
エスケープ/アンスケープ 式のリテラルとして使用するために、文字列内のメタ文字をエスケープします。
IsMatch 正規表現で入力文字列内の一致が見つかる場合は true を返します。
一致する 入力文字列で一致が見つかった場合は、Match オブジェクトを返します。
次と一致する 入力文字列で見つかったすべての一致を含む MatchCollection オブジェクトを返します。
Replace 入力文字列内の一致を、指定された置換文字列に置き換えます。
Split 入力文字列を正規表現の一致で区切られた配列要素に分割して、文字列の配列を返します。

多くのメソッドに加えて、 Regex オブジェクトのコンストラクターで指定できるオプションも多数あります。 これらのオプションはビットマスクの一部であるため、OR を組み合わせて使用できます (はい、複数行と単一行の両方を同時に有効にすることができます)。

オプション 説明
Compiled ループ内で多数の一致操作を実行する場合は、このオプションを使用します。 これにより、各イテレーションで式を解析する手順が保存されます。
Multiline 入力文字列内の行数とは関係ありません。 むしろ、入力文字列全体の ^ 先頭と $ 末尾ではなく、BOL と EOL に一致するように、 と の動作を変更するだけです。
IgnoreCase 検索文字列を照合するときに、パターンで大文字と小文字の区別が無視されます。
IgnorePatternWhitespace パターンに必要なだけ空白を付け、(?# comment #) 構文を使用してパターン内コメントを使用できるようにします。
SingleLine 入力文字列内の行数とは関係ありません。 代わりに、 は、既定の \n を除く任意の文字ではなく、任意の文字と一致します。

正規表現を使用して検証、照合、置換を行う場合に一般的に使用する場合があります。 多くの場合、Regex クラス自体をインスタンス化しなくても、 Regex クラスの静的 メソッドを使用 してこれらを実現できます。 検証を実行するには、 Regex クラスの IsMatch() メソッドを使用して、適切な式を作成または検索し、入力文字列に適用する必要があります。 たとえば、次の関数は、正規表現を使用して郵便番号を検証する方法を示しています。

private void ValidateZipButton_Click(object sender, System.EventArgs e)
{
   String ZipRegex = @"^\d{5}$";
   if(Regex.IsMatch(ZipTextBox.Text, ZipRegex))
   {
      ResultLabel.Text = "ZIP is valid!";
   }
   else
   {
      ResultLabel.Text = "ZIP is invalid!";
   }
}

同様に、次のスニペットで示すように、静的 Replace() メソッドを使用して、一致を特定の文字列に置き換えることができます。

String newText = Regex.Replace(inputString, pattern, replacementText);

最後に、次のようなコードを使用して、入力文字列内の一致のコレクションを反復処理できます。

private void MatchButton_Click(object sender, System.EventArgs e)
{
   MatchCollection matches = Regex.Matches(SearchStringTextBox.Text, 
MatchExpressionTextBox.Text);
   MatchCountLabel.Text = matches.Count.ToString();
   MatchesLabel.Text = "";
   foreach(Match match in matches)
   {
      MatchesLabel.Text += "Found " + match.ToString() + " at 
position " + match.Index + ".<br>";
   }
}

通常、 Regex クラスのインスタンスをインスタンス化する必要があるのは、既定の動作以外のものを指定する必要がある場合です。 特に、オプションを設定します。 たとえば、大文字と小文字とパターンの空白を無視し、その式の一致のセットを取得する Regex のインスタンスを作成するには、次のようなコードを使用します。

Regex re = new Regex(pattern, 
   RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = re.Matches(inputString);

これらのサンプルの完全な動作バージョンは、シンプルな ASP.NET ページとして、この記事のダウンロードに含まれています。

無料ツール

レギュレータ (http://royo.is-a-geek.com/iserializable/regulator/) – クライアント側で実行するように設計された正規表現テスト ツールであり、Web サービスを介した RegexLib との緊密な統合が含まれており、Match、Split、Replace などのサポートを提供します。 パフォーマンス分析と構文の強調表示が含まれます。

RegexDesigner.NET (http://www.sellsbrothers.com/tools/#regexd) – 正規表現の構築とテストに役立つ強力なビジュアル ツールです。 式をアプリケーションに統合するのに役立つ C# や VB.NET コードとコンパイル済みアセンブリを生成します。

正規表現ワークベンチ (v2.0) (https://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=C712F2DF-B026-4D58-8961-4EE2729D7322) – 正規表現を作成、テスト、および調査するための Eric Gunnerson のツール。 "Examine-o-matic" 機能があり、正規表現の上にマウスを置いて意味をデコードできます。

高度なトピック

私が本当に考えなければならない2つの正規表現機能は、名前付きグループとルックアラウンド処理です。 これらはまれな場合にのみ必要になるため、ここではこれらのトピックについて簡単に説明します。

名前付きグループを使用すると、個々の一致するグループに名前を付け、プログラムによって式内でこれらのグループを参照できます。 これは、入力文字列内の要素の順序と配置を再配置することによって、入力文字列を再フォーマットする方法として Replace メソッドと組み合わせると特に強力です。 たとえば、MM/DD/YYYY 形式の文字列形式で日付を指定し、DD-MM-YYYY 形式で日付を指定したとします。 式の書き込みを使用して、最初の形式をキャプチャし、その Matches コレクションを反復処理し、各文字列を解析し、文字列操作を使用して置換文字列を作成できます。 これには、かなりの量のコードとかなりの量の処理が必要です。 名前付きグループを使用すると、次のように同じ処理を実行できます。

String MDYToDMY(String input)
{
   return Regex.Replace(intput, @"\b(?<month>\d{1,2})/(?<day>\d{1,2}/(?<year>\d{4})\b", "${day}-
${month}-${year}");
}

グループを番号で参照したり、名前で参照したりすることもできます。 どのような場合でも、このような参照はまとめて バックリファレンスと呼ばれます。 バックリファレンスのもう 1 つの一般的な用途は、繰り返し文字を検索するための式 [ a-z]\1 など、一致する式自体にあります。 これは 'aa'、'bb'、'cc' と一致し、等価であり、'ab '{2} または 'ac' またはその他の 2 文字の組み合わせを許可する [a-z] または [a-z][a-z] と同じではありません。 Backreferences を使用すると、式は、既に解析および一致した入力文字列の一部に関する情報を記憶できます。

"ルックアラウンド処理" とは、多くの正規表現エンジンでサポートされている正と負の先読み機能と後読み機能を指します。 すべての正規表現エンジンで、ルックアラウンド処理のすべてのバリエーションがサポートされているわけではありません。 これらのコンストラクトは、一致する可能性がある場合でも文字を使用しません。 一部のパターンは、ルックアラウンド処理なしでは記述できません。特に、パターンの 1 つの部分の存在が別の部分の存在に依存するパターンです。 lookaround の各フレーバーの構文を以下に示します。

構文 説明
(?=…) 肯定的な先読み
(?!...) 否定的な先読み
(?<=...) 肯定的な後読み
(?<!...) 否定的な後読み

ルックアラウンド処理が必要な例の 1 つは、パスワードの検証です。 パスワードの長さは 4 ~ 8 文字で、少なくとも 1 桁の数字を含む必要があるパスワード制限を検討してください。 これを行うには、一致する \d をテストし、文字列操作を使用して長さをテストしますが、正規表現で全体を実行するには先読みする必要があります。 この式が示すように、具体的には正の先読み: ^(?=.*\d)。{4,8}$

まとめ

正規表現は、テキスト内のパターンを記述する非常に強力な方法を提供し、文字列の検証と操作のための優れたリソースになります。 .NET Frameworkでは、System.Text.RegularExpressions 名前空間内の正規表現と、特にそこに存在する Regex クラスの一流のサポートが提供されます。 API の使用は簡単です。正しい正規表現を思い付くのは、多くの場合、難しい部分です。 幸いにも、正規表現は再利用性が高く、他のユーザーが設計した式を見つけたり、作成に苦労している式を見つけたりできる多くのリソースがオンラインにあります。

リソース

正規表現ライブラリhttp://regexlib.com/

正規表現ディスカッション リスト http://aspadvice.com/login.aspx?ReturnUrl=%2fSignUp%2flist.aspx%3fl%3d68%26c%3d16&l=68&c=16

正規表現フォーラム http://forums.regexadvice.com/

正規表現 Web ログ http://blogs.regexadvice.com/

正規表現の習得 (O'Reilly)、Jeffrey Friedl http://regex.info/

.NET 正規表現リファレンス https://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextRegularExpressions.asp

Jscript 正規表現の構文 https://msdn.microsoft.com/library/en-us/script56/html/js56jsgrpregexpsyntax.asp

正規表現の情報 http://www.regular-expressions.info

著者について

Microsoft ASP.NET MVP のスティーブン A. Smith は、ASPAlliance.com と DevAdvice.com の社長兼所有者です。 また、ASPSmith Ltd のオーナー兼ヘッド インストラクターでもあります。NET に重点を置いたトレーニング会社。 ASP.NET 開発者のクックブックと ASP.NET By Example の 2 つの書籍と、MSDN および AspNetPRO 雑誌の記事を執筆しています。 Steve は毎年いくつかのカンファレンスで講演し、INETA スピーカー局のメンバーです。 Steve は、経営管理の修士課程と、コンピューター サイエンス エンジニアリングの理学の学位を取得しています。

Steve は で ssmith@aspalliance.comアクセスできます。

© Microsoft Corporation. All rights reserved.