regex basic

[] => [] 안에 존재하는 문자들중 한 문자만을 나타낸다.
    예) [abc] 는 a , b, c 중에 한문자. '-' 는 범위. 즉 [a-f] 는 [abcdf]

\w => [a-zA-Z0-9_]
\d => [0-9]
.  => 모든 문자에 대응되는 한 문자
+  => 한 문자 이상(하나는 반드시 존재, repeats the preceding regular expression at least once)
*  => 문자나 집합이 없는 경우 또는 하나 이상 연속하는 경우에 일치한다. 없어도 ok
?  => 문자가 없거나 하나와 대응하는 문자   예) https?// - s가 없거나 한번 있는 경우와 대응
    ca?r matches both `car' and `cr', but nothing else.
\ => 문자그대로 . 를 나타냄 (이스케이프)

ab{3}" => b가 3개까지 (abbb)
ab{3,5}" =>  b가 3개에서 5개 까지 (abbb, abbbb, abbbbb )
ab{2,}" => b의 개수가 2개 이상 (abb, abbbbb ...)
{3,} => 최소 3번 일치함을 의미한다.

() => ()안에 있는 글자들을 그룹화, 하위 표현식.
    a(bc)* : a라는 문자를 포함하고 bc라는 문자열이 없거나 계속반복( a, abc abcbc 등)
    a(bc)  : a라는 문자를 포함하고 bc라는 문자열이 있거나 없거나. (a,abc)

    (\d{1,3}\.){3}\d{1,3} => ip addr

공백 문자 => \n, \r, \t, \f-form feed, \v-vertical tab
\s => 공백 ,[\f\n\r\t\v],
\S => 공백아님 , [^\f\n\r\t\v]

|  => or 연산자, 묶음 안에서 하나를 일치시키고자 할 때
    IP주소를 구성하는 각 숫자 묶음을 유효한 조합으로 정의하는 규칙
    - 모든 한 자리 혹은 두 자리 숫자
    - 1로 시작하는 모든 세자리 숫자
    - 2로 시작하면서 두 번째 자리 숫자가 0부터 4사이의 모든 세 자리 숫자
    - 25로 시작하면서 세 번째 자리 숫자가 0부터 5사이의 모든 세 자리 숫자

    (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))

    주민번호 : \d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\d{6}


탐욕적 수량자,  게으른 수량자
    *                            *?
    +                            +?
    {n,}                       {n,}?

    예) "<B>111</B> and <B>222</B>" 에서

    <[Bb]>.*</[Bb]>  => 111 and 222
    <[Bb]>.*?</[Bb]> => 111, 222

egrep 에서 111이후 대문자3자리로 끝나는  프로세스 검색
==> -w 옵션 사용

ps -ef | egrep -w  '111[A-Z]{3}'

// regexTest.java

import java.util.regex.*;

class regexTest
{
    public static void runRegExTest()
    {
        String[] data1 = {   "bat", "baby", "bonus", "c", "cA",
                            "ca", "co", "c.", "c0", "c#","1","9",
                            "car","combat","count", "date", "disc"
        };
        String[] pattern1 = { "(\\d+)","\\d+",".",".*","c[a-z]*","c[a-z]",
                            "c[a-zA-Z]", "c[a-zA-Z0-9]",
                            "c.","c.*","c\\.","c\\w","c\\d","c.*t", "[b|c].*",
                            ".*a.*", ".*a.+", "[b|c].{2}"
        };

        String[] data2 = { "1","9","01","012","22.133.244.111",
                            "a","b","c","abc","abcbc","0","00",
                            " ", "  ","1 a","1 ","2  ",
                            "2  a", "1aaaaaaaa1","1aaaaaaaa21","22cccc22dd33",
                            "cd","cde","NTRY50BA","22","55","123","233","444",
                            "ab12a0","abcd2a044", "abab12a0b1",
                             "6511","621217-1812222","681109-1652222",
                            "쭌안아빠","20/09/2012","20-09-2012","가","하",
                            "01","0412","12","14","11","17"
        };

        String[] pattern2 = { "(\\d+)","\\d+","\\d","\\d*","(\\d{1,3}\\.){3}\\d{1,3}",
                              "a(bc)","(0)","0", "\\s", "\\s\\s","\\S",
                              "\\s.", "\\s*", "\\d\\s+", "\\d\\s+\\w","\\d[a-zA-Z]*\\d+",
                              "\\d[a-zA-Z]*\\d+?",
                              "((?:[a-z][a-z]+))","(?:[a-z][a-z]+)","\\d{1,2}",
                              "((?:[a-z][a-z]*[0-9]+[a-z0-9]*))",
                              "[a-z][a-z]*[0-9]+[a-z0-9]*",
                              "\\d{2}(0[1-9]|1[0-2])",
                              "\\d{2}(0[1-9]|1[0-2])-[1-4]\\d{6}",
                              "(0[1-9]|[12][0-9]|3[01])",
                              "\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\\d{6}",
                              "[가-힣]","[가-힣]*","\\d{2}","0[1-9]|1[0-2]",
                              "\\d{1,2}[-\\/]\\d{1,2}[-\\/]\\d{2,4}"
        };

        for(int x=0; x < pattern2.length; x++)
        {
            Pattern p = Pattern.compile(pattern2[x]);
            System.out.print( String.format("%-40s", " " + pattern2[x] ) );
            System.out.print( " =>  " );

            for(int i=0; i < data2.length; i++)
            {
                Matcher m = p.matcher(data2[i]);

                if(m.matches())
                {
                    System.out.print(data2[i] +" ,");
                }
            }

            System.out.println("");
        }

        System.out.println("\n\n");

        for(int x=0; x < pattern1.length; x++)
        {
            Pattern p = Pattern.compile(pattern1[x]);
            System.out.print( String.format("%-40s", " " + pattern1[x] ) );
            System.out.print( " =>  " );

            for(int i=0; i < data1.length; i++)
            {
                Matcher m = p.matcher(data1[i]);

                if(m.matches())
                {
                    System.out.print(data1[i] +" ,");
                }
            }
            System.out.println("");
        }
    }

    public static void main(String[] args)
    {
        runRegExTest();
    }
}

출력

(\d+)                                   =>  1 ,9 ,01 ,012 ,0 ,00 ,22 ,55 ,123 ,233 ,444 ,6511 ,01 ,0412 ,12 ,14 ,11 ,17 ,
\d+                                     =>  1 ,9 ,01 ,012 ,0 ,00 ,22 ,55 ,123 ,233 ,444 ,6511 ,01 ,0412 ,12 ,14 ,11 ,17 ,
\d                                      =>  1 ,9 ,0 ,
\d*                                     =>  1 ,9 ,01 ,012 ,0 ,00 ,22 ,55 ,123 ,233 ,444 ,6511 ,01 ,0412 ,12 ,14 ,11 ,17 ,
(\d{1,3}\.){3}\d{1,3}                   =>  22.133.244.111 ,
a(bc)                                   =>  abc ,
(0)                                     =>  0 ,
0                                       =>  0 ,
\s                                      =>    ,
\s\s                                    =>     ,
\S                                      =>  1 ,9 ,a ,b ,c ,0 ,가 ,하 ,
\s.                                     =>     ,
\s*                                     =>    ,   ,
\d\s+                                   =>  1  ,2   ,
\d\s+\w                                 =>  1 a ,2  a ,
\d[a-zA-Z]*\d+                          =>  01 ,012 ,00 ,1aaaaaaaa1 ,1aaaaaaaa21 ,22 ,55 ,123 ,233 ,444 ,6511 ,01 ,0412 ,12 ,14 ,
11 ,17 ,
\d[a-zA-Z]*\d+?                         =>  01 ,012 ,00 ,1aaaaaaaa1 ,1aaaaaaaa21 ,22 ,55 ,123 ,233 ,444 ,6511 ,01 ,0412 ,12 ,14 ,
11 ,17 ,
((?:[a-z][a-z]+))                       =>  abc ,abcbc ,cd ,cde ,
(?:[a-z][a-z]+)                         =>  abc ,abcbc ,cd ,cde ,
\d{1,2}                                 =>  1 ,9 ,01 ,0 ,00 ,22 ,55 ,01 ,12 ,14 ,11 ,17 ,
((?:[a-z][a-z]*[0-9]+[a-z0-9]*))        =>  ab12a0 ,abcd2a044 ,abab12a0b1 ,
[a-z][a-z]*[0-9]+[a-z0-9]*              =>  ab12a0 ,abcd2a044 ,abab12a0b1 ,
\d{2}(0[1-9]|1[0-2])                    =>  6511 ,0412 ,
\d{2}(0[1-9]|1[0-2])-[1-4]\d{6}         =>
(0[1-9]|[12][0-9]|3[01])                =>  01 ,22 ,01 ,12 ,14 ,11 ,17 ,
\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\d{6} =>  621217-1812222 ,681109-1652222 ,
[가-힣]                                 =>  가 ,하 ,
[가-힣]*                                =>  쭌안아빠 ,가 ,하 ,
\d{2}                                   =>  01 ,00 ,22 ,55 ,01 ,12 ,14 ,11 ,17 ,
0[1-9]|1[0-2]                           =>  01 ,01 ,12 ,11 ,
\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}         =>  20/09/2012 ,20-09-2012 ,


(\d+)                                   =>  1 ,9 ,
\d+                                     =>  1 ,9 ,
.                                       =>  c ,1 ,9 ,
.*                                      =>  bat ,baby ,bonus ,c ,cA ,ca ,co ,c. ,c0 ,c# ,1 ,9 ,car ,combat ,count ,date ,disc ,  disc ,
c[a-z]*                                 =>  c ,ca ,co ,car ,combat ,count ,
c[a-z]                                  =>  ca ,co ,
c[a-zA-Z]                               =>  cA ,ca ,co ,
c[a-zA-Z0-9]                            =>  cA ,ca ,co ,c0 ,
c.                                      =>  cA ,ca ,co ,c. ,c0 ,c# ,
c.*                                     =>  c ,cA ,ca ,co ,c. ,c0 ,c# ,car ,combat ,count ,
c\.                                     =>  c. ,
c\w                                     =>  cA ,ca ,co ,c0 ,
c\d                                     =>  c0 ,
c.*t                                    =>  combat ,count ,
[b|c].*                                 =>  bat ,baby ,bonus ,c ,cA ,ca ,co ,c. ,c0 ,c# ,car ,combat ,count ,
.*a.*                                   =>  bat ,baby ,ca ,car ,combat ,date ,
.*a.+                                   =>  bat ,baby ,car ,combat ,date ,
[b|c].{2}                               =>  bat ,car ,