WEB開發 de 點滴

          by sanwish

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            38 隨筆 :: 0 文章 :: 4 評論 :: 0 Trackbacks

          正規表現

          正規表現とは、一定の規則に従って文字列を表す表現です。例えば、「abcdeg」「abcd」と文字列があったと時に、「ab*」と一定の規則を持たせた場合に、「abcdeg」「abcd」の2つの文字列が表現されます。
          主に、正規表現と聞くと、JavaScrptや、perlなどが代表的なところでしょう。昔から、Javaは文字列表現には適さなかったのです。しかし、JDK1.4からこの正規表現が使えるようになりました。これで、結構簡単なチェックロジックや、置換処理が簡単になったのかもしれません。

          ■実行環境

          OS Windows XP Professional
          J2SE SDK 1.4.1_01

          ■主な正規表現

          ● 文字クラス
          構文マッチ対象
          [ABC]A,B,Cのいずれか1文字
          [A-Z]A~Zまでのいずれか1文字
          [A-Za-z0-9]A~Z, a~z, 0-9までのいずれか1文字
          [^ABC]A,B.C以外の文字
          [^A-Z]A~Z以外の文字
          \w英數文字。[a-zA-Z0-9]と同様
          \W\w以外の文字
          \d數値文字。[0-9]と同等
          \D\d以外の文字
          \s空白文字
          \S\s以外の文字
          \n改行文字

          ● 繰り返し
          構文マッチ対象
          A+1個以上連続したA(A, AA, AAA, ...)
          A*0個以上連続したA( , A, AA, AAA, ...)
          A?0または1つの任意文字( , A, B, C, ...)
          A{5}5回繰り返し。 AAAAAと同じ
          A{3,}3回以上繰り返し。 AAA+と同じ
          A{3,5}3回以上5回以下繰り返し。 AAAA?A?と同じ

          ● 位置指定
          構文マッチ対象
          ^行の先頭
          $行の末尾

          では、上記の例を実際にプログラムにしてみましょう。

          ■サンプルプログラム

          ● ソースコード
          RegexTest.java
          /* RegexTest */
          import java.util.regex.*;
          
          public class RegexTest {
            public static void main(String[] args) {
              
              String value = null;
              // 構文 [ABC]
              value = "C";
              //value = "c";
              System.out.println("1  : " + Pattern.matches("[ABC]", value));
              
              // 構文 [A-Z]
              value = "T";
              //value = "t";
              System.out.println("2  : " + Pattern.matches("[A-Z]", value));
              
              // 構文 [A-Za-z0-9]
              value = "3";
              //value = "あ";
              System.out.println("3  : " + Pattern.matches("[A-Za-z0-9]", value));
              
              // 構文 [^ABC]
              value = "D";
              //value = "B";
              System.out.println("4  : " + Pattern.matches("[^ABC]", value));
              
              // 構文 [^A-Z]
              value = "c";
              //value = "C";
              System.out.println("5  : " + Pattern.matches("[^A-Z]", value));
              
              // 構文 \w
              value = "9";
              //value = "た";
              System.out.println("6  : " + Pattern.matches("\\w", value));
              
              // 構文 \W
              value = "た";
              //value = "t";
              System.out.println("7  : " + Pattern.matches("\\W", value));
              
              // 構文 \d
              value = "5";
              //value = "k";
              System.out.println("8  : " + Pattern.matches("\\d", value));
              
              // 構文 \D
              value = "k";
              //value = "3";
              System.out.println("9  : " + Pattern.matches("\\D", value));
              
              // 構文 \s
              value = " ";
              //value = "t";
              System.out.println("10 : " + Pattern.matches("\\s", value));
              
              // 構文 \S
              value = "t";
              //value = " ";
              System.out.println("11 : " + Pattern.matches("\\S", value));
              
              // 構文 \n
              value = "\n";
              //value = "t";
              System.out.println("12 : " + Pattern.matches("\\n", value));
              
              // 構文 A+
              value = "AAA";
              //value = "BBB";
              System.out.println("13 : " + Pattern.matches("A+", value));
              
              // 構文 A*
              value = "A";
              //value = "BBBBB";
              System.out.println("14 : " + Pattern.matches("A*", value));
              
              // 構文 A?
              value = "A";
              //value = "AA";
              System.out.println("15 : " + Pattern.matches("A?", value));
              
              // 構文 A{5}
              value = "AAAAA";
              //value = "AAAAAAA";
              System.out.println("16 : " + Pattern.matches("A{5}", value));
              
              // 構文 A{3,}
              value = "AAA";
              //value = "AA";
              System.out.println("17 : " + Pattern.matches("A{3,}", value));
              
              // 構文 A{3,5}
              value = "AAAA";
              //value = "AAAAAA";
              System.out.println("18 : " + Pattern.matches("A{3,5}", value));
              
              // 構文 ^take.*
              value = "takeoba";
              //value = "java";
              System.out.println("19 : " + Pattern.matches("^take.*", value));
              
              // 構文 *.oba$
              value = "takeoba";
              //value = "java";
              System.out.println("20 : " + Pattern.matches(".*oba$", value));
              
            }
          }
          

          ● コンパイルと実行結果
          C:\java>javac RegexTest.java
          
          C:\java>java RegexTest
          1  : true
          2  : true
          3  : true
          4  : true
          5  : true
          6  : true
          7  : true
          8  : true
          9  : true
          10 : true
          11 : true
          12 : true
          13 : true
          14 : true
          15 : true
          16 : true
          17 : true
          18 : true
          19 : true
          20 : true
          
          C:\java>
          

          上記をご覧の通り、すてべ true です。コメント部分と既存の部分を入れ替えてコンパイルし、実行すると全て false になります。これは、正規表現で表されていないため、false となります。また、下記の用に具體的な処理が可能です。

          ● ソースコード
          RegexTest2.java
          /* RegexTest2 */
          import java.util.regex.*;
          
          public class RegexTest2 {
            public static void main(String[] args) {
              
              // 攜帯電話電話番號チェック//String tel = "03-0000-9999";
              String tel = "090-0000-9999";
              System.out.println(Pattern.matches("090-[\\d]{4}?-[\\d]{4}?", tel));
              
              // メールアドレスチェック//String mail = "aaabbb.net";
              String mail = "aaa@bbb.co.jp";
              System.out.println(Pattern.matches(
                "[\\d[a-z]]+@[\\d[a-z]]+.[a-z]+|[\\d[a-z]]+@[\\d[a-z]]+.[a-z]+.[a-z]+|[\\d[a-z]]+@[\\d[a-z]]+.[a-z]+.[a-z]+.[a-z]+",
                mail));
              
              // 郵便番號チェック//String yubin = "123-123";
              String yubin = "123-1234";
              System.out.println(Pattern.matches("[\\d]{3}?-[\\d]{4}?", yubin));
            }
          }
          

          ● コンパイルと実行結果
          C:\java>javac RegexTest2.java
          
          C:\java>java RegexTest2
          true
          true
          true
          
          C:\java>
          

          コメント部分と既存の部分を入れ替えてコンパイルし、実行すると全て false になります。これは、正規表現で表されていないため、false となります。
          さらに、正規表現を使用して、文字列の置換作業が容易となりました。下記サンプルプログラムをご覧ください。

          ● ソースコード
          RegexTest3.java
          /* RegexTest3 */
          public class RegexTest3 {
            public static void main(String[] args) {
              
              String str = null;
              // & → &
              str = "&";
              System.out.println("置換前の値 : " + str);
              str = str.replaceAll("&", "&");
              System.out.println("置換後の値 : " + str);
              
              // < → &lt;
              str = "<";
              System.out.println("置換前の値 : " + str);
              str = str.replaceAll("<", "&lt;");
              System.out.println("置換後の値 : " + str);
              
              // > → &gt;
              str = ">";
              System.out.println("置換前の値 : " + str);
              str = str.replaceAll(">", "&gt;");
              System.out.println("置換後の値 : " + str);
              
            }
          }
          

          ● コンパイルと実行結果
          C:\java>javac RegexTest3.java
          
          C:\java>java RegexTest3
          置換前の値 : &
          置換後の値 : &amp;
          置換前の値 : <
          置換後の値 : &lt;
          置換前の値 : >
          置換後の値 : &gt;
          
          C:\java>
          

          posted on 2008-11-07 10:48 sanwish 閱讀(661) 評論(0)  編輯  收藏 所屬分類: web開發
          主站蜘蛛池模板: 丰县| 伊春市| 天长市| 龙岩市| 栾城县| 永顺县| 海盐县| 保康县| 灵山县| 百色市| 神木县| 曲麻莱县| 长岭县| 崇礼县| 毕节市| 海南省| 桐城市| 宁夏| 肥东县| 蒙阴县| 诸暨市| 城口县| 龙江县| 丽江市| 三河市| 黄平县| 普洱| 芒康县| 航空| 靖安县| 永福县| 彝良县| 思南县| 望谟县| 永善县| 桂东县| 菏泽市| 南召县| 景德镇市| 郎溪县| 长治县|