Java 정규식 함수1 - Pattern, Matcher

정규식은... Java API보시고 이리저리만들어보는 수 밖에 없습니다.


일단 질문하신 내용의 예제를 알려드릴께요.


설명할게 너무 많기 때문에... 적절한 수준에서 정리했습니다.



import java.util.regex.*;       // Pattern과 Matcher가 속한 패키지

class RegularEx5
{
      public static void main(String[] args)
      {
            String source = "23123()asdawe()23123()asdawe()23123()asdawe()";
            String pattern = "\\d+\\(\\)";             // 숫자(\\d)뒤에오는 괄호를 패턴으로 지정

            //  \d는 숫자를 의미하며 +는 하나이상의 숫자가 있어야함을 의미

           // 괄호는 예약문자(?)이므로 \\를 앞에 붙여줘야 괄호로 인식

           //  괄호앞에 \\를 붙이지 않으면 그룹화문자로 인식한다.

          //  \를 \\와 같이 두개씩 쓰는 이유는 문자열 내에서 \를 표현하려면 두개 써줘야하기 때문
            StringBuffer sb = new StringBuffer();

            Pattern p = Pattern.compile(pattern);
            Matcher m = p.matcher(source);

            System.out.println("source:"+source);

            int i=0;
            while(m.find()) {

                 // 지정한 패턴과 매칭되는 부분을 치환한다. 마지막 두글자인 괄호를 잘라내고

                // 원하는 문자(@@)로 바꾼다.

                // find()를 통해서 패턴과 일치하는 부분은 m.group()을 통해서 얻는다.
                  m.appendReplacement(sb, m.group().substring(0, m.group().length()-2)+"@@");
            }

            m.appendTail(sb);
            System.out.println("result:"+sb.toString());
      }
}

/*
source:23123()asdawe()23123()asdawe()23123()asdawe()
result:23123@@asdawe()23123@@asdawe()23123@@asdawe()
*/


숫자뒤에오는 ()를 @@로 바꾼겁니다.



[예제2] - 다양한 정규식활용예

import java.util.regex.*;         // Pattern과 Matcher가 속한 패키지


class RegularEx2

{

         public static void main(String[] args)

         {

                  String[] data = {"bat", "baby", "bonus", "c", "cA",

                                                      "ca", "co", "c.", "c0", "c#",

                                                      "car","combat","count", "date", "disc"

                                                      };                 

                  String[] pattern = {".*","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}"

                                                               };


                  for(int x=0; x < pattern.length; x++) {

                           Pattern p = Pattern.compile(pattern[x]);

                           System.out.print("Pattern : " + pattern[x] + "  결과: ");

                           for(int i=0; i < data.length; i++) {

                                    Matcher m = p.matcher(data[i]);

                                    if(m.matches())

                                             System.out.print(data[i] + ",");

                           }

                           System.out.println();

                  }

         } // public static void main(String[] args)

}


/*

Pattern : .*  결과: bat,baby,bonus,c,cA,ca,co,c.,c0,c#,car,combat,count,date,disc,

Pattern : c[a-z]*  결과: c,ca,co,car,combat,count,

Pattern : c[a-z]  결과: ca,co,

Pattern : c[a-zA-Z]  결과: cA,ca,co,

Pattern : c[a-zA-Z0-9]  결과: cA,ca,co,c0,

Pattern : c.  결과: cA,ca,co,c.,c0,c#,

Pattern : c.*  결과: c,cA,ca,co,c.,c0,c#,car,combat,count,

Pattern : c\.  결과: c.,

Pattern : c\w  결과: cA,ca,co,c0,

Pattern : c\d  결과: c0,

Pattern : c.*t  결과: combat,count,

Pattern : [b|c].*  결과: bat,baby,bonus,c,cA,ca,co,c.,c0,c#,car,combat,count,

Pattern : .*a.*  결과: bat,baby,ca,car,combat,date,

Pattern : .*a.+  결과: bat,baby,car,combat,date,

Pattern : [b|c].{2}  결과: bat,car,

*/

[참고]쌍따옴표(")내에서 escape문자(\)를 표현하려면 escape문자를 '\\'와 같이 두 번 사용해야한다.




[예제3] - 다양한 정규식활용예
public void mpt(){
        // [ ,# ]이나 [ ( ]나 [ * ]나 [,숫자] 인것을 [ : ]으로 치환
        //  OR [ | ] 연산자를 이용해서 한번에 처리 가능
      
        String data = "REEL ,9AS*SY.,#((CABLE C)";            
        String replacement = ":";
        String pattern1 = "\\,#|\\(|\\*|\\,\\d"; // <-- OR [ | ]를 사용해서 패턴을 구분
       
       
        Pattern p = Pattern.compile(pattern1);
        Matcher m = p.matcher(data);
        StringBuffer sb = new StringBuffer();
        while(m.find()){
            System.out.println(m.group());
            m.appendReplacement(sb, replacement);
        }
        m.appendTail(sb);
        System.out.println("af : "+ sb.toString() );
}


자주 쓰일 만한 몇 가지 패턴들을 만들어서 테스트하였다. 그 결과를 정리해보면 다음과 같다.



정규식

설명

결과

c[a-z]*

c로 시작하는 영단어

c,ca,co,car,combat,count,

c[a-z]

c로 시작하는 두 자리 영단어

ca,co,

c[a-zA-Z]

c로 시작하는 두 자리 영단어

(a~z 또는 A~Z, 즉 대소문자 구분안함)

cA,ca,co,

c[a-zA-Z0-9]

c\w

c로 시작하고 숫자와 영어로 조합된 두 글자

cA,ca,co,c0,

.*

모든 문자열

bat,baby,bonus,c,cA,ca,co,c.,c0,c#,car,combat,count,date,disc,

c.

c로 시작하는 두 자리

cA,ca,co,c.,c0,c#,

c.*

c로 시작하는 모든 문자열(기호포함)

cA,ca,co,c.,c0,c#,car,combat,count,

c\.

c.와 일치하는 문자열

'.'은 정규식표현에 사용되는 문자이므로 escape문자인 '\'를 사용해야한다.

c.,

c\d

c[0-9]

c와 숫자로 구성된 두 자리 문자열

c0,

c.*t

c로 시작하고 t로 끝나는 모든 문자열

combat,count,

[b|c].*

[bc].*

[b-c].*

b 또는 c로 시작하는 문자열

bat,baby,bonus,c,cA,ca,co,c.,c0,c#,car,combat,count,

[^b|c].*

[^bc].*

[^b-c].*

b 또는 c로 시작하지 않는 문자열

date,disc,

.*a.*

a를 포함하는 모든 문자열

* : 0 또는 그 이상의 문자

bat,baby,ca,car,combat,date,

.*a.+

a를 포함하는 모든 문자열.

+: 1 또는 그 이상의 문자

+는 *과는 달리 반드시 하나 이상의 문자가 있어야 하므로 a로 끝나는 단어는 포함되지 않았다.

bat,baby,car,combat,date,

[b|c].{2}

b 또는 c로 시작하는 세 자리 문자열.

(b 또는 c 다음에 두 자리이므로 모두 세 자리)

bat,car,


출처 : 플래시로 배우는 Java ( http://www.javachobo.com )

by 태풍80 | 2008/03/30 11:42 | JAVA/JDBC | 트랙백

오라클 CallableStatement사용 예제

오라클 CallableStatement사용 예제

 

OracleCallableStatement 와 Oracle Ref Cursor 를 사용하세요.

-- http://otn.oracle.co.kr/ 에서도 자료를 확인하실수 있습니다.

 

http://otn.oracle.com/tech/java/sqlj_jdbc/htdocs/jdbc_faq.htm#34_08

 

 

 

/**  *
 * @(#)RefCursor.java 
 *
 *
 * Oracle REF Cursor를 사용해 프로시저에서 여러행을 반환하는 예제
 *
 *
 * -- 패키지가 헤더 생성
 * CREATE OR REPLACE PACKAGE ref_cursor_pkg AS
 *  TYPE ref_type IS REF CURSOR;
 *  PROCEDURE ref_cursor_pro(v_result OUT ref_type, v_sql in VARCHAR2);
 * END;
 *
 *
 * -- 패키지 본문 생성
 * CREATE OR REPLACE PACKAGE BODY ref_cursor_pkg AS
 *  PROCEDURE ref_cursor_pro(v_result OUT  ref_type, v_sql IN VARCHAR2)  AS
 *  begin
 *      OPEN v_result FOR v_sql;
 *  END;
 * END;
 *
 *
 * REF CURSOR는 오라클 PL/SQL에서 여러 레코드의 쿼리 결과를 가져올때 편하게 사용 할 수 있습니다.
 * 이 방법은 Oracle8i 이상에서 실행가능합니다.
 *
 * 아래 예제는 특정 SQL문을 PL/SQL In Parameter로 입력 받아서 쿼리 결과를 Out파라미터로
 * 반환하는 예제 입니다.
 * Java Source를 실행하기 전에 위에 패키지 헤더와 본문을 SQL*Plus에서 먼저 실행해 주세요
 *
 */
 
 
 
import java.sql.*;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
 
 
 
public class RefCursor {
 
 
    public static void main(String[] args) {
        RefCursor vTest = new RefCursor();
        vTest.prepareCall();
 
    }
 
    void prepareCall(){
       
        try {
    
            DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
            Connection conn =
            DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE", "scott", "tiger");
            CallableStatement cstmt;
           
            //Stored Procedure 를 호출하기 위해 JDBC Callable Statement를 사용 합니다
            cstmt =   conn.prepareCall("BEGIN ref_cursor_pkg.ref_cursor_pro(?,?); END;");
           
            //프로시져의 In Parameter로 SELECT문장을 넘깁니다.
            cstmt.setString(2,"SELECT empno, ename FROM emp");
           
            //CallableStatement를 위한 REF CURSOR OUTPUT PARAMETER를
            //OracleTypes.CURSOR로 등록합니다.
            cstmt.registerOutParameter (1, OracleTypes.CURSOR);
           
            //CallableStatement를 실행합니다.
            cstmt.execute ();
           
            //getCursor() method를 사용하기 위해 CallableStatement를
            //OracleCallableStatement object로 바꿉니다.
            OracleCallableStatement ocstmt = (OracleCallableStatement)cstmt;
           
            //OracleCallableStatement 의 getCursor() method를 사용해서 REF CURSOR를
            //JDBC ResultSet variable 에 저장합니다.
            ResultSet cursor =  ocstmt.getCursor (1);
           
            //쿼리결과 empno, ename 출력
            while (cursor.next ()) {
                System.out.print (cursor.getString (1)+"          ");
                System.out.println (cursor.getString (2));
            }
           
        }catch(Exception e){
           
        }
   
    }
}

by 태풍80 | 2008/03/23 20:07 | JAVA/JDBC | 트랙백

<< 이전 페이지     다음 페이지 >>