출처 수집가의 블로그 | 수집가
원문 http://blog.naver.com/tlsgidgh/140044956653

출처: http://www.webmadnag.net

[JSP] 문자열중에서 숫자만 추출하기

개발작업 중에 흔하게 부딪히는 문자열 조작 중에서 이번에는 아주 쉽다고 할 수 있는 숫자만 추출하는 방법을 알아 볼까합니다. 첫 번째로는 J2SDK 1.4에 포함된 java.util.regex를 import해서 정규 식으로 처리하는 방법과 두번째로는 Character 클래스의 isDigit를 이용하는 방법, 그리고 마지막으로 고전적인 아스키 코드값을 이용하는 방법을 알아보겠습니다.

세가지 모두 동일하게 extrace_numeral 이라는 함수로 구성하였으며 함수의 인자로 추출하고 싶은 문자열(String)을 넘겨주면 루프를 돌면서 문자열중 숫자에 해당하는 값을 임시 변수에 담는 방식을 사용하고 있습니다. 이 루프 부분을 살짝 변경하여 문자만을 추출하여 보내게 할수도 있습니다. 예를 들면 정규식에서 숫자에 매칭 패턴 "\d"를 문자 패턴인 "\D"로 바꾸면 문자만을 추출한 결과 값을 되돌려 줍니다. isDigit를 이용하는 방법은 단지 부정만 하면 됩니다.

<%--정규식을 이용한 방법--%>
<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.regex.*" %>
<%!
  public String extract_numeral(String str){


   String numeral = "";
    if( str == null )
    {
      numeral = null;
    }
    else {
      String patternStr = "\\d"; //숫자를 패턴으로 지정
      Pattern pattern = Pattern.compile(patternStr);
      Matcher matcher = pattern.matcher(str);

      while(matcher.find()) {
      numeral += matcher.group(0); //지정된 패턴과 매칭되면 numeral 변수에 넣는다. 여기서는 숫자!!
      }
    }


   return numeral;
  }
%>

isDigit 와 아스키 코드값을 이용하는 방법은 해당 문자가 숫자인지 판별하는 if 부분에서 isDigit를 쓰느냐 아스키 코드값으로 비교하느 냐의 차이입니다. 아래에서 확인해 보시기 바랍니다.

<%--Character.isDigit()를 이용한 방법--%>
<%!
  public String extract_numeral(String str)
  {
    String numeral = "", temp = "";
    if ( str == null )
    {
      numeral = null;
      }
    else
    {
        for( int i = 0; i < str.length(); i++ )
        {
                temp = str.substring(i,i+1);
                if( Character.isDigit(str.charAt(i)) ) //isDigit를 이용
                {
                numeral += temp;
                }
         }
       }
     return numeral;
  }
%> 


<%--아스키 코드값을 이용하는 방법--%>
<%!
  public String extract_numeral(String str)
  {
    String numeral = "", temp = "";
    if ( str == null )
    {
      numeral = null;
      }
    else
    {
        for( int i = 0; i < str.length(); i++ )
        {
             temp = str.substring(i,i+1);
             if( temp.charAt(0)>47 && temp.charAt(0)<58 ) //아스키 코드값으로 비교
             {
                numeral += temp;
             }
         }
       }
     return numeral;
  }
%>

예제를 작성하는 시간보다 글자 컬러넣는 시간이 더 걸렸습니다. 그래도 보기좋은 떡이 먹기에도 좋다는 신념 굽히지 않았습니다. 조만간 굽혀질 것 같습니다.^^

작성자: 다자래(mfcchang@naver.com)
웹제작 토탈 커뮤니티 http://www.webmadang.net