WEB開(kāi)發(fā) de 點(diǎn)滴

          by sanwish

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            38 隨筆 :: 0 文章 :: 4 評(píng)論 :: 0 Trackbacks

          正規(guī)表現(xiàn)

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

          ■実行環(huán)境

          OS Windows XP Professional
          J2SE SDK 1.4.1_01

          ■主な正規(guī)表現(xiàn)

          ● 文字クラス
          構(gòu)文マッチ対象
          [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英數(shù)文字。[a-zA-Z0-9]と同様
          \W\w以外の文字
          \d數(shù)値文字。[0-9]と同等
          \D\d以外の文字
          \s空白文字
          \S\s以外の文字
          \n改行文字

          ● 繰り返し
          構(gòu)文マッチ対象
          A+1個(gè)以上連続したA(A, AA, AAA, ...)
          A*0個(gè)以上連続した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?と同じ

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

          では、上記の例を?qū)g際にプログラムにしてみましょう。

          ■サンプルプログラム

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

          ● コンパイルと実行結(jié)果
          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 になります。これは、正規(guī)表現(xiàn)で表されていないため、false となります。また、下記の用に具體的な処理が可能です。

          ● ソースコード
          RegexTest2.java
          /* RegexTest2 */
          import java.util.regex.*;
          
          public class RegexTest2 {
            public static void main(String[] args) {
              
              // 攜帯電話(huà)電話(huà)番號(hào)チェック//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));
              
              // 郵便番號(hào)チェック//String yubin = "123-123";
              String yubin = "123-1234";
              System.out.println(Pattern.matches("[\\d]{3}?-[\\d]{4}?", yubin));
            }
          }
          

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

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

          ● ソースコード
          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);
              
            }
          }
          

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

          posted on 2008-11-07 10:48 sanwish 閱讀(662) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): web開(kāi)發(fā)
          主站蜘蛛池模板: 灵台县| 太谷县| 玉林市| 宜君县| 运城市| 玛纳斯县| 博爱县| 北票市| 从化市| 三原县| 榆中县| 清河县| 文成县| 苏尼特右旗| 安图县| 昌图县| 股票| 科尔| 建平县| 顺义区| 墨竹工卡县| 修文县| 昌邑市| 抚松县| 贡觉县| 尉氏县| 宣化县| 墨脱县| 晋中市| 盐源县| 西乌珠穆沁旗| 吉水县| 琼结县| 彰武县| 铜鼓县| 临沭县| 宣汉县| 个旧市| 徐水县| 偏关县| 安平县|