특수문자 제거하는 기능이 필요해서 만들기 시작했습니다. 처음에는 모든 특수문자를 제거해야 하나 싶었는데,
생각해보니 그럴 필요는 없을 것 같았습니다. 단지, 쿼리문에 들어갔을 때 문제를 일으킬 만한 것들만 제거하면 되지 않을까 싶더군요.
그래서 지난번 한자→한글처럼 단순한 방식으로 만들려고 했습니다.
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
'JAVA > Debug' 카테고리의 다른 글
HttpClient java.net.SocketTimeoutException: Read timed out (0) | 2014.08.14 |
---|---|
ORA-00257: archiver error. Connect internal only, until freed. (0) | 2014.08.08 |
쿼리는 정상인데 java.sql.SQLException: ORA-00900: SQL 문이 부적합합니 (0) | 2014.08.08 |
java.lang.IllegalStateException: response already committed (0) | 2014.08.08 |
웹로직 구동시 Exception (0) | 2014.08.08 |
ORA-01861: 리터럴이 형식 문자열과 일치하지 않음 (0) | 2014.08.08 |
The processing instruction target matching "[xX][mM][lL]" (0) | 2014.08.08 |
QueryForObject 의 Null 처리 방법 (0) | 2014.08.08 |