正規表現 (正規表現) は、文字列パターン マッチングのための効率的で便利な方法を提供します。ほとんどすべての高級言語は、正規表現のサポートを提供するか、呼び出し用の既製のコード ライブラリを提供します。この記事では、ASP 環境での一般的な処理タスクを例として、正規表現の応用スキルを紹介します。
1. パスワードと電子メール アドレスの形式を確認する
最初の例では、正規表現の基本的な機能を示します。つまり、任意の複雑な文字列を抽象的に記述します。これが意味するのは、正規表現は、アプリケーションで遭遇するあらゆる文字列パターンを少量のコードだけで記述できる正式な文字列記述方法をプログラマーに提供するということです。たとえば、技術的な仕事に従事していない人の場合、パスワード形式の要件は次のように説明できます。パスワードの最初の文字は文字である必要があり、パスワードは 4 文字以上 15 文字以下でなければなりません。パスワードには、文字、数字、およびアンダースコア以外の文字以外を含めることはできません。
プログラマとして、ASP ページがそれを理解し、不正なパスワード入力を防ぐために適用できるように、上記のパスワード形式の自然言語記述を他の形式に変換する必要があります。このパスワード形式を表す正規表現は、^[a-zA-Z]w{3,14}$ です。
ASP アプリケーションでは、以下に示すように、パスワード検証プロセスを再利用可能な関数として記述することができます。
Function TestPassword(strPassword)
ディムリ
re = 新しい RegExp
re.IgnoreCase = false を
設定します
re.global = false
re.Pattern = "^[a-zA-Z]w{3,14}$"
TestPassword = re.Test(strPassword)
End Function
以下では、パスワード形式をチェックするための正規表現と自然言語の説明を比較します:
パスワードの最初の文字は文字である必要があります: 正規表現の説明は "^[a-zA-Z]"、ここで "^" です。は文字列の先頭を示し、ハイフンは指定された範囲内のすべての文字と一致するように RegExp に指示します。
パスワードは 4 文字以上、15 文字以下である必要があります。正規表現の説明は「{3,14}」です。
パスワードには文字、数字、アンダースコア以外の文字を含めることはできません。正規表現の説明は「w」です。
いくつかの注意: {3, 14} は、前のパターンが 3 文字以上 14 文字以下に一致することを意味します (最初の文字を加えると、4 ~ 15 文字になります)。中括弧内の構文は非常に厳密であり、コンマの両側にスペースを使用できないことに注意してください。スペースを追加すると、正規表現の意味に影響し、パスワード形式の検証中にエラーが発生します。また、上記の正規表現の末尾には「$」文字は追加されません。 $ 文字により、正規表現は文字列と最後まで一致し、その後に文字が追加されない有効なパスワードが保証されます。
パスワード形式の検証と同様に、電子メール アドレスの正当性の確認も非常に一般的な問題です。正規表現を使用して単純な電子メール アドレスの検証を実行すると、次のように実装できます
。
ディムリ
Set re = new RegExp
re.pattern = "^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$"
Response.Write re.Test(" [email protected] ")
%>
2. HTML ページの特定の部分を抽出する
HTML ページからコンテンツを抽出する際に直面する主な問題は、必要なコンテンツの部分を正確に識別する方法を見つけなければならないことです。たとえば、次はニュースの見出しを表示する HTML コード スニペットです:
<table border="0" width="11%" class="Somestory">
<tr>
<td幅="100%">
<p align="center">その他のコンテンツ...</td>
</tr>
</テーブル>
<table border="0" width="11%" class="見出し">
<tr>
<td幅="100%">
<p align="center">イラク戦争! </td>
</tr>
</テーブル>
<table border="0" width="11%" class="Someotherstory">
<tr>
<td幅="100%">
<p align="center">その他のコンテンツ...</td>
</tr>
</table>
上記のコードを見ると、ニュースのタイトルが中央のテーブルに表示され、そのクラス属性が Headline に設定されていることが簡単にわかります。 HTML ページが非常に複雑な場合は、Microsoft IE 5.0 以降で提供される追加機能を使用して、ページの選択した部分の HTML コードのみを表示できます。 http://www.microsoft.com/Windows/ieにアクセスしてください。 /WebAccess/default.ASP詳細をご覧ください。この例では、これがクラス属性が Headline に設定されている唯一のテーブルであると仮定します。次に、正規表現を作成し、正規表現を通じてこの見出しテーブルを検索し、このテーブルを独自のページに含める必要があります。 1 つ目は、正規表現をサポートするコードを作成することです:
<%
薄々、strHTML
Set re = new RegExp ' 正規表現オブジェクトを作成します
re.IgnoreCase = true
re.Global = false '最初に一致した後で検索を終了します
%>
ここで、抽出したい領域について考えてみましょう。ここで、抽出したいのは、終了タグとニュース タイトルのテキストを含む、<table> 構造全体です。したがって、検索の開始文字は <table> 開始タグである必要があります: re.Pattern = "<table.*(?=Headline)"。この正規表現はテーブルの開始タグと一致し、開始タグと「見出し」の間のすべてを返します (改行を除く)。一致した HTML コードを返す方法は次のとおりです。
'一致する HTML コードをすべて Matches コレクションに入れます。
Set Matches = re.Execute(strHTML)
'一致する HTML コードをすべて表示します
試合の各アイテムについて
応答.項目.値の書き込み
次へ
' の 1 つを表示
Response.write Matches.Item(0).Value は、
このコードを実行して、前に示した HTML フラグメントを処理します。正規表現は、<table border="0" width="11%" class=" のように一致内容を返します。正規表現 式内の「(?=Headline)」は文字を取得しないため、テーブルの残りの部分を取得するコードも非常に単純です。 "<table.*(?=Headline) (.|n)*?</table>" のうち、"(.|n)" の後の "*" は 0 から任意の文字に一致します。 ” は、「*」の一致範囲を最小限に抑えます。つまり、式の次の部分を見つける前に、可能な限り少ない文字と一致します。
「?」リミッターは非常に重要です
。他のテーブルのコードを返す式。たとえば、上記の HTML コード スニペットの場合、この「?」を削除すると、返されるコンテンツは次のようになります。
<table border="0" width="11%" class="見出し">
<tr>
<td幅="100%">
<p align="center">イラク戦争! </td>
</tr>
</テーブル>
<table border="0" width="11%" class="Someotherstory">
<tr>
<td幅="100%">
<p align="center">その他のコンテンツ...</td>
</tr>
</テーブル>
返されたコンテンツには、Headline テーブルの <table> タグだけでなく、Someotherstory テーブルも含まれています。ここでの「?」は必須であることがわかります。
この例では、かなり理想的な前提を前提としています。実際のアプリケーションでは、状況はさらに複雑になることが多く、特に使用されているソース HTML コードの記述に影響を与えない場合、ASP コードを記述することは特に困難です。最も効果的な方法は、抽出するコンテンツの近くの HTML の分析により多くの時間を費やし、頻繁にテストして、抽出されたコンテンツが正確に必要なものであることを確認することです。さらに、正規表現がソース HTML ページのコンテンツと一致しない状況にも注意して対処する必要があります。コンテンツはすぐに変更される可能性があるため、他の人がコンテンツの形式を変更したからといって、ページにとんでもないエラーが発生しないようにしてください。
3. テキスト データ ファイルを解析する
XML ドキュメント、構造化テキスト、さらには非構造化テキストさえも、多くの形式と種類が ASP アプリケーションのデータ ソースになります。以下で説明する例は、修飾子を使用した構造化テキスト ファイルです。修飾子 (引用符など) は、レコードをフィールドに分割する区切り文字が文字列に含まれている場合でも、文字列の各部分が分離できないことを示します。
以下は単純な構造化テキスト ファイルです:
姓、名、電話番号、説明 Sun、Wukong、312 555 5656、ASP は非常に優れています、Pig、Bajie、847 555 5656、私は映画プロデューサーです
。最初の行はタイトルで、次の 2 行はカンマで区切られたレコードです。このファイルの解析も非常に簡単で、ファイルを (改行記号に従って) 行に分割し、フィールドに従って各レコードを分割するだけです。ただし、特定のフィールドの内容にカンマを追加すると、
姓、名、電話番号、説明 Sun、Wukong、312 555 5656、I like ASP、VB、SQL
Pig、Bajie、847 555 5656、私は映画プロデューサーです。
カンマ区切り文字のみを認識するパーサーの観点では、最後のフィールドに 2 つのフィールドの内容が含まれるため、最初のレコードを解析するときに問題が発生します。この種の問題を回避するには、区切り文字を含むフィールドを修飾子で囲む必要があります。一重引用符は一般的に使用される修飾子です。上記のテキスト ファイルに一重引用符修飾子を追加すると、その内容は次のようになります:
姓、名、電話番号、説明 Sun、Wukong、312 555 5656、「ASP、VB、SQL が好きです」
Zhu, Bajie、847 555 5656、「私は映画プロデューサーです」
これで、どのカンマが区切り文字で、どのカンマがフィールドの内容であるかを判断できるようになりました。つまり、引用符内にあるカンマを内容と見なすだけで済みます。フィールドの。次に行う必要があるのは、カンマに基づいてフィールドを分割するタイミングと、カンマをフィールド コンテンツとして扱うタイミングを決定する正規表現パーサーを実装することです。
ここでの問題は、ほとんどの正規表現が直面する問題とは少し異なります。通常、私たちはテキストの小さな部分を調べて、それが正規表現と一致するかどうかを確認します。ただし、ここでは、テキスト行全体を検討した後でのみ、引用符内に何が含まれているかを確実に知ることができます。
この問題を説明する例を次に示します。テキスト ファイルからコンテンツの半行をランダムに抽出し、1、ビーチ、黒、21、'、犬、猫、アヒル、'、を取得します。この例では、「1」の左側に他のデータがあるため、その内容を解析することは非常に困難です。このデータ フラグメントの前に単一引用符が何個あるかわからないため、引用符内にどの文字が含まれているかを判断できません (引用符内のテキストは解析中に分割できません)。データ フラグメントの前に偶数の一重引用符が付いている (または付いていない) 場合、「'、dog、cat、duck、'」 は引用符で囲まれた文字列となり、分割できません。先行する引用符の数が奇数の場合、「1、ビーチ、ブラック、21、'」は文字列の終わりであり、分割できません。
したがって、正規表現では、文字が引用符のペアの内側にあるか外側にあるかを判断するために、出現する引用符の数を考慮して、テキスト行全体を分析する必要があります。つまり、:,(?=([^']*'[ ^']*')*(?![^']*'))。この正規表現は、最初に引用符を見つけてから検索を続け、コンマの後の一重引用符の数が偶数またはゼロであることを確認します。この正規表現は、次の判断に基づいています。カンマの後の一重引用符の数が偶数であれば、カンマは文字列の外側にあります。次の表に、より詳細な手順を示します。
、カンマを探します。
(?= は、このパターンに一致するよう前方検索を続けます:
(新しいパターンを開始する
[^']*' [非引用文字] 0 以上の後に引用符が続く
[^']*'[^']*) [引用符以外の文字] 0 個以上の後に引用符が続きます。前のコンテンツと組み合わせると、引用ペアと一致します
)* はパターンを終了し、パターン全体 (引用符のペア) と 0 回以上一致します。
(?! 前方検索して、このパターンを除外します
[^']*' [非引用文字] 0 以上の後に引用符が続く
) 終了モードの下には、
文字列パラメータを受け入れ、文字列内のコンマ区切り文字と一重引用符修飾子に従って文字列を分割し、結果の配列を返す VBScript 関数があります。
Function SplitAdv(strInput)
薄暗いオブジェクト
Set objRE = new RegExp
'RegExp オブジェクトを設定
objRE.IgnoreCase = true
objRE.Global = true
objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))"
' Replace メソッドは chr(8) を使用して必要なものを置き換えますカンマを使用するには、chr(8) がb
' 文字、b が文字列内に非常にまれに出現することがあります。
' 次に、b に従って文字列を分割し、配列に保存します。
SplitAdv = Split(objRE.Replace(strInput, "b"), "b")
関数の終了
つまり、正規表現を使用してテキスト データ ファイルを解析すると、ファイルの分析や複雑な条件に基づいた有用なデータの抽出にかかる時間を大幅に節約でき、開発時間を短縮できるという利点があります。急速に進化する環境では、依然として多くの従来型データが利用可能であるため、効率的なデータ分析ルーチンを構築する方法を知ることは貴重なスキルとなります。
4. 文字列置換
最後の例では、VBScript 正規表現の置換関数を見ていきます。 ASP は、さまざまなデータ ソースから取得したテキストを動的にフォーマットするためによく使用されます。 VBScript 正規表現の機能を利用して、ASP は一致する複雑なテキストを動的に変更できます。 HTML タグを追加して一部の単語を強調表示することは、検索結果内の検索キーワードを強調表示するなどの一般的な用途です。
これがどのように行われるかを説明するために、文字列内のすべての「.NET」を強調表示する例を見てみましょう。この文字列は、データベースや他の Web サイトなど、どこからでも取得できます。
<%
正規表現 = 新しい正規表現を設定します
regEx.Global = true
regEx.IgnoreCase = True
'正規表現パターン、
'「.NET」で終わる単語または URL を探します。
regEx.Pattern = "(b[a-zA-Z._]+?.NETb)"
' 置換関数のテストに使用される文字列
strText = "Microsoft は新しい Web サイトwww.ASP.NETを作成しました。"
'正規表現の Replace メソッドを呼び出します。
'$1 は、一致したテキストを現在の位置に挿入することを意味します
Response.Write regEx.Replace(strText, _
"<b style='color: #000099; font-size: 18pt'>$1</b>")
%>
この例には、注意しなければならない重要な点がいくつかあります。正規表現全体は 1 対のかっこで囲まれており、その機能は、後で使用するために一致するコンテンツをすべてインターセプトすることであり、置換テキストでは $1 によって参照されます。置換ごとに最大 9 つの同様のインターセプトを使用でき、それぞれ $1 ~ $9 で参照されます。正規表現の Replace メソッドは、VBScript 自体の Replace 関数とは異なります。必要なパラメータは、検索するテキストと置換するテキストの 2 つだけです。
この例では、検索された「.NET」文字列を強調表示するために、文字列を太字のタグとその他のスタイル属性で囲みます。この検索・置換技術を利用すると、Webサイトの検索プログラムに検索キーワードを強調表示する機能を簡単に追加したり、ページ内に出現したキーワードに対して他のページへのリンクを自動で追加したりすることができます。
結論
この記事で紹介したいくつかの正規表現テクニックが、正規表現をいつ、どのように適用するかについてインスピレーションを得ていただければ幸いです。この記事の例は VBScript で記述されていますが、正規表現は ASP.NET でも役立ちます。これはサーバー側のコントロール フォーム検証の主要なメカニズムの 1 つであり、System を通じて .Text. RegularExpressions 名前空間全体にエクスポートされます。 .Text. RegularExpressions 名前空間。