728x90
반응형

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

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

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,