簡単な入門正規表現-第十章正規表現の総合的な応用例

19885 ワード

<style>獛content-region{background-mage:url(http://p.blog.csdn.net/images/p_blog_csdn_net/rcom10002/EntryImages/20081027/watermark.gif"";?content-region h 3{border:1 px dotted_;background-カラー:padding:10 px;font-size:24 px;?;font-size:16 px;line-height:28 px;text-decoration:none;text-indent:32 px;}咻咻咻content-region.regex-pattern{font-style:oblique;font-family:“Courier”Courier、monoospace;background-from;border-top-style:sold;border-right-style:none;bord-bott-style:sold;border-left-style:none;bord-top-bord-bord;perpder;border-bottom-width:1 px;border-left-width:1 px;border-right-カラー:葏FF0000;border-left-カラー:(zhi)FF 0000;padding:0 px 5 px 5 px;Courier,monoospace;background-カラー;border-top-style:sold;border-right-style:none;border-bott-style:sold;border-left-style:none;bord-top-bord-bord:96 x;border-bottom-width:1 px;border-left-width:1 px;border-right-カラー:_;border-left-カラー:_;padding:0 px 5 px 5 px;?3333339;3333339;?3333309;33333333991;333333339;?3333333333333333991;;????菵};dding:padding:0 px:0 px:0 px:0 px:0 px:0 px:0 px:0 px;-style:dotted;border-left-style:dotted;width:atot;菗{border:1 px dotted铀padding:16 px;background-ft 9 f 9;magin-top:16 px;margin-bottom:16 px;margin-bottom:16 px;margin-left:64 px;葷
简单入门正则表达式 - 第十章 正则表达式综合应用举例

ウェブページを見ていると、よくブラウザにURLを入力します.www.cctv.comのように、URLは対応するIPアドレスに変換されます.その結果は「123.0.111.108」かもしれません.各部分は256以下の非負の整数であり、厳密には007のようなコンテンツもIPアドレスの一部として許可されているが、一般的には前の「0」は不要である.
IPアドレスフォーマットの概念を簡単に理解した後、IPアドレスを検証する実験を行います.まず、3桁の数字にマッチする正規表現/d{1,3}を作成します.マッチした結果は123.0.111.108です.間隔の小数点はマッチの結果としてではないことに注意してください.次に、結果の4つの数字からは、第一の数字のほかに、残りの3つの数字の前に「小数点」があります.だから、新しい表式/d{1,3}(/){1,3}を作成できます.を選択して、文字列全体にマッチします.最初の/d{1,3}は第一グループの数字です.後の内容は残りの三組の数字にマッチしています.そして、各グループの数字の前には必ず「小数点」が必要です.「小数点」は正規表現で任意の文字を表すことができるので、使用時には変換が必要です.
第一章の概説の内容では、正規表現は主に文字列のマッチングに用いられ、論理検査はあまり得意ではないことが分かりましたが、正規表現の応用技術をよりよく把握するために、ここではまだ論理的な検証をしてから、より合理的で簡単な検証方法を見ます.IPアドレスを簡単に検証できる正規表現です.以下は論理検査です.より正確に言えば、各グループの数字は0から255までの間であれば大丈夫です.範囲的に見れば、各グループの数字の最大桁数はつまり3桁で、最大値は255です.したがって、まず200から255までの3桁のパターン2([0-4]/d 124 5[0-5]を作成します.を選択して、0より200未満のスタイルにマッチするように構成します.0-1?/d{1,2}.現在は、2つの部分のスタイルを結合して2([0-4]/d1245[0-5])(0-1]?/d{1,2}を構成して、各グループのデジタル検証を満たすことができます.最終的にまとめて整理すると、(2([0-4]/[0-4]/[0-4]/[0-4]/d_]//(([0-4]/[0-4]/d_]/d_]//[0-1]/[0-4]/[0-1.((((((([0-4])))))//d{1,2}{3}.このスタイルは前に作った/d{1,3}(/./d{1,3}){3}と同じです.同様に、デジタル範囲を含まない/dを、デジタル範囲検証を含む2([0-4]/d 124; 5[0-5])|[0-1]?d{1,2}に置き換えるだけである.
今、私達は更に1種の比較的に合理的で簡単なプログラミングの実現方法を試みて、まず正規表現を使います.4組の数字に分割して、プログラムで各組の数字の範囲を検証して、それらが0から255の間に存在するかどうかを判断して、以下はVB.Netの実現したコードです.
  1. Imports System.Text.RegularExpressions
  2. Module ModuleForTest
  3. Sub Main()
  4. Try
  5. Console.WriteLine(" IP :")
  6. Dim userInput As String = System.Console.ReadLine()
  7. If Regex.IsMatch(userInput, "^[0-9]{1,3}(/.[0-9]{1,3}){3}$") Then
  8. Dim ipSections As String() = Regex.Split(userInput, "/.")
  9. For Each ipNumber As String In ipSections
  10. Dim tempNumber As Integer = Convert.ToInt32(ipNumber)
  11. If tempNumber < 0 OrElse tempNumber > 256 Then
  12. Console.WriteLine(" IP !")
  13. Exit Sub
  14. End If
  15. Next
  16. Console.WriteLine(" IP !")
  17. Else
  18. Console.WriteLine(" IP !")
  19. End If
  20. Catch ex As Exception
  21. Console.WriteLine(ex.Message)
  22. Finally
  23. Console.ReadLine()
  24. End Try
  25. End Sub
  26. End Module
次に、ファイル印刷に関するページ番号の設定についてのチェック例を見ます.図からは、カンマ区切りの複数の具体的なページ番号の値で印刷範囲を表現したり、カンマ区切りの複数のページ番号の範囲で表現したり、ページコードの値とページ範囲を組み合わせて表現したりすることができます.ページ番号の設定については、ページ番号の設定を行うことができます.ページ番号とページ番号に小節を加えて構成します.ここでは簡単なページ番号の設定から始めて、複雑な設定を処理します.
具体的な単一のページ番号については、直接数値表式/d+を利用して表現すればいいが、ページ番号はゼロから始まるわけではないので、トップは1から9で表されるべきであり、後続の数字はゼロの制限を受けずに/dで表現できるので、修正後の非ゼロ自然数パターンは[1−9]であるべきである.//d*;ページ番号の範囲は具体的なページ番号のペアによって表現され、中間に範囲を示す識別子「-」を配置し、最終的に作成されたスタイルは[1−9]/d*-[1−9]/d*.この2つのパターンを組み合わせて、私たちが欲しい具体的なページ番号とページ番号の範囲の混合スタイルを組み合わせます.[1−9]/d*.まずコンマ前のパターンを分析します.([1−9]/d**[1−9]/d*-[1−9]/d*)/[1−9]/d*)は、該当する内容は単一の具体的なページ番号またはページ番号の範囲です.また、後の繰り返しパターンには、カンマ以外のスタイルの前の部分は完全に一致しています.このような単一の具体的なページ番号またはページ番号の範囲を追加するのに便利です.現在作成されたスタイルは、数字の表現形式のページ番号またはページ番号の範囲を完全に満たすことができます.組み合わせました
次に、ページ番号と小節の組み合わせを作り続けます.図から見ると、単一のページ番号または単一の小節は、最初のページp 1、第二ページp 2のようにアルファベットで組み合わせられています.これに類推します.小節の表現形式はページ番号と似ています.アルファベットはs 1、第二節はs 2となります.そうすると、ページ番号に小節のグループが入ります.つまりp[1-9]/d***s[1-9]/d*、数字のページ番号の表現形式の規則と同じように、この表現を繰り返し利用して、完全なスタイルを構築するべきです.)/d*)*コンマの前には単一のページ番号と小節にマッチしていたり、ページ番号と小節の範囲、コンマおよびコンマの後には「*」を利用してこのルールを継続しています.
第一章の内容を通して、正規表現は論理的な処理が得意ではないことが分かります.だから、私達が作成したページ番号表式も形式に対する制約にすぎません.論理機能を入れたいなら、必要な場合はプログラムコードに合わせなければなりません.ここではページ番号間の空白文字の問題をしばらく考えません.また、ページ番号の出現順序は小さい時から大きいと仮定して、次のようなJavascriptプログラムを使って、最初のパターンに合わせてこの規則を検証します.
  1. <script language="javascript" type="text/javascript">
  2. function isValidPageRangeForPrint {
  3. var pageRangeText = document.getElementById("page_range").value;
  4. //
  5. if (!pageRangeText) {
  6. return false;
  7. }
  8. //
  9. if (!/^([1-9]/d*|[1-9]/d*-[1-9]/d*)(,([1-9]/d*|[1-9]/d*-[1-9]/d*))*$/.test(pageRangeText)) {
  10. return false;
  11. }
  12. //
  13. var regexForSinglePage = /[1-9]/d*/;
  14. var matchResult = pageRangeText.match(/[1-9]/d*|[1-9]/d*-[1-9]/d*/);
  15. var pageEnumCount = 0;
  16. var pageContainer = new Object();
  17. // pageContainer
  18. for (var i = 0; i < matchResult.length; i++) {
  19. if (regexForSinglePage.test(matchResult[i])) {
  20. //
  21. pageContainer["" + pageEnumCount++] = matchResult[i];
  22. } else {
  23. //
  24. var pagesForRange = matchResult[i].split(/-/);
  25. pageContainer["" + pageEnumCount++] = pagesForRange[0];
  26. pageContainer["" + pageEnumCount++] = pagesForRange[1];
  27. }
  28. }
  29. // pageContainer ,
  30. while (pageEnumCount-- > 0) {
  31. if (pageContainer[pageEnumCount] < pageContainer[pageEnumCount - 1]) {
  32. //
  33. return false;
  34. }
  35. }
  36. return true;
  37. }
  38. </script>