Egloos 728x90

구글 애널리틱스


2008/12/26 17:01

[ Java ][ 에러 ] java.util.regex.PatternSyntaxException ▷ Java 복습




특수문자 제거하는 기능이 필요해서 만들기 시작했습니다. 처음에는 모든 특수문자를 제거해야 하나 싶었는데,
생각해보니 그럴 필요는 없을 것 같았습니다. 단지, 쿼리문에 들어갔을 때 문제를 일으킬 만한 것들만 제거하면 되지 않을까 싶더군요.

그래서 지난번 한자→한글처럼 단순한 방식으로 만들려고 했습니다.

public class TestRemoveSpChar {
 public TestRemoveSpChar(){
  String testStr = "+k*j+S{}fdk!j???dsjf@kjgk#fjfk$fdjk%...djflkdsj^fjsjfd&jflkjfds*djflk";
  
  spCharRid(testStr);
 }

 public String spCharRid(String strInput){
  System.out.println("@spCharRid original: "+ strInput);
  String strWork = strInput;
  String[] spChars = {
    "`", "-", "=", ";", "'", "/", "~", "!", "@",
    "#", "$", "%", "^", "&", "|", ":", "<", ">",
    "\";
    "*",
    "+",
    "{",
    "}",
    "?"
    "."
    // ), (, ], [는 이전에 걸러지기에 거르지 않음
  };
  
  int spCharLen = spChars.length;
  
   for(int i = 0; i < spCharLen; i++){
    System.out.println("@for @proceed : "+i);
    System.out.println("@spCharRid @target is : " + spChars[i]);
    strWork = strWork.replaceAll(spChars[i], "");
    System.out.println("@spCharRid @replaceAll: "+ strWork);
   }

  System.out.println("@spCharRid output  : "+ strWork);
  return strWork;
 }

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




이렇게 만들어봤는데 에러가 납니다. 특히 특수문자 "\" 의 경우에는 컴파일조차 안 됩니다.
때문에 그 부분만 일단 주석처리를 했습니다. 이제 컴파일은 되지만 실행시키면 여전히 에러가 납니다.

java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*
^

at java.util.regex.Pattern.error(Pattern.java:1541)
 at java.util.regex.Pattern.sequence(Pattern.java:1658)
 at java.util.regex.Pattern.expr(Pattern.java:1558)
 at java.util.regex.Pattern.compile(Pattern.java:1291)
 at java.util.regex.Pattern.<init>(Pattern.java:1047)
 at java.util.regex.Pattern.compile(Pattern.java:785)
 at java.lang.String.replaceAll(String.java:1663)
 at com.libeka.web.index.search.TestRemoveSpChar.spCharRid(TestRemoveSpChar.java:37)
 at com.libeka.web.index.search.TestRemoveSpChar.<init>(TestRemoveSpChar.java:9)
 at com.libeka.web.index.search.TestRemoveSpChar.main(TestRemoveSpChar.java:46)
Exception in thread "main"


또는 이런 에러가 발생할 수도 있습니다.
java.util.regex.PatternSyntaxException: Illegal repetition
{


에러 메시지가 약간 달라도 원인은 같습니다. 인터넷을 뒤져봤더니, 정규식의 문법적 에러를 나타내는 것이라는데
무슨 소린지 잘 모르겠습니다 -_-;;
(이 익셉션을 뱉어내는 PatternSyntaxException 클래스에 대한 정보도 봤습니다만...역시 모르겠네요 _no)

하여튼 중요한 건 replaceAll(), repalceFirst(), replace() 등을 사용할 때
일부 특수문자에서 이런 에러가 발생한다고 하는군요.



이 문제를 해결하려면 해당 특수문자 앞에 \를 달아줘야 합니다.
이런 쓰임새 때문에 "\"가 컴파일조차 안 되었나 보네요.
(그런데 그러면 \기호를 제거하거나 하고 싶을 때는 어떻게 해야 하는거지??
아시는 분은 부디 우매한 민중에게 가르침을....)

String[] spChars = {
    "`", "-", "=", ";", "'", "/", "~", "!", "@",
    "#", "$", "%", "^", "&", "|", ":", "<", ">",
    //"\",
    "\\*",
    "\\+",
    "\\{",
    "}", //←원래대로라면 이것도 \\를 안 달아주면 에러가 나야 하는데, 실제로 돌려보면 안 나네요?
    "\\?",
    "."
  };

이렇게 고쳤으니 에러는 안 뜹니다. 하지만 문제가 모두 해결된 걸까요?

실행시키고 결과값을 보면, 문자열이 모두 사라져 있는 것을 볼 수 있습니다!
('''전략''')
@spCharRid @target is : \?
@spCharRid @replaceAll: kjSfdkjdsjfkjgkfjfk$fdjk...djflkdsj^fjsjfdjflkjfdsdjflkdjs(dsflkdsj)
@for @proceed : 23
@spCharRid @target is : .
@spCharRid @replaceAll:  ← 헉, 문자열이 다 어디로 사라진 거야?!
@spCharRid output  :

정확한 이유는 모르겠지만 "."만 골라서 삭제하려고 했는데 모든 문자가 사라져 버리네요.

으아~~~ 이유가 뭐야~~~~~~

어쩔 수 없이 이것도 주석처리해버렸습니다. 제발 누가 저에게 가르침을... _no

덧글

  • 밀리네스 2008/12/26 17:29 # 답글

    자바는 내부적으로 Java String과 Regular expression string을 구분해서 사용합니다.
    일반 자바프로그래밍에서 에서 를 문자열안에 넣을때는 \ 를 사용하시면 되지만 정규표현식에서는 \\ 로 표시하셔야 합니다.
  • 밀리네스 2008/12/26 17:32 # 답글

    그리고 . (dot)은 정규표현식에서 한글자를 의미합니다. 점을 표시하고 싶으시면 . 로 슬래시를 붙여주셔야 합니다.
  • 밀리네스 2008/12/26 17:33 # 답글

    아무튼 정규표현식의 특수문자들에 대해서 주의해서 사용하시면 됩니다.
  • 별소리 2008/12/27 23:35 #

    아, 뭔가 구분해서 처리되고 있었군요. 그런데 정규식이 뭔지 잘 모르겠어서...;;
  • 풍운 2011/12/07 20:10 # 삭제 답글

    좋은정보 입니다..
    30분 혜멨습니다..
댓글 입력 영역

애드센스336x280

알라딘TTB-Egloos(하단-일반)



이 이글루를 링크한 사람 (블랙)

36