2013-06-04 2 views
3

'+', '*', '(', ')'를 사용하면 메타 문자가 매달려있는 오류가 계속 발생합니다.메타 문자 매달기

나는 이미 정규식에서 그 문자를 이스케이프 처리했지만 오류가 발생합니다. 이것은 내가 무엇을 가지고 :

"[-\\+\\*/%\\(\\)]" 

업데이트 :

테스트 : 다른 클래스에서

String input = "+"; 

String vals = new WNScanner(input).getNextToken(); //********** 
System.out.println("token: " + vals); 
System.out.println(vals.matches("[-+*/%()]")); 

:이 라인에

... 

    String expression = input; 
    ... 

public String getNextToken() { 

    String[] token = {""}; 

    if (expression.length() == 0) 
     return ""; 

    token = expression.split("\\s"); 
    recentToken = token[0]; 
    expression = expression.replaceFirst(token[0], "");  //************* 
    expression = expression.trim(); 

    return token[0]; 


} 

*가 예외 .

+1

없음 "[]"의 내 탈출 슬래시가 필요 없다 (단, "-"는 "[]"의 내측 첫 문자이어야 함). –

+0

@ShadowCreeper 오. 하지만 백 슬래시를 포함하지 않으면 여전히 오류가 발생합니다. 어떤 생각? – user2430361

+0

질문에 오류 메시지가 표시된 시도 (코드)를 게시하십시오 (간단한 클래스 또는 단일 기능으로 구분할 수 있음). –

답변

6

OK, 나는 특히이 라인에 ... 당신이 달성하고자하는 것을 모르는 : 당신의 입력 문자열이 "+" 인 경우

expression = expression.replaceFirst(token[0], ""); 

다음 전체 정규식+입니다. 그리고 그것은 합법적이지 않습니다.

당신은 어떤 정규식 관련 작업에서 사용하기 위해 입력 문자열을 인용해야하고, 그 포함 String.replaceFirst().replaceAll() (그러나 하지.replace() ...). 따라서

가 수행 그들의

final String re = Pattern.quote(token[0]); 
expression = expression.replaceFirst(re, ""); 
+0

와우. 감사. 그것으로 문제가 해결되었습니다. 하지만 Pattern이 무엇인지 설명해 주시겠습니까? – user2430361

+0

'Pattern'은 정규 표현식 처리를위한 JDK의 기본 클래스입니다. 정적 팩토리 메소드'Pattern.compile()'을 호출하여 정규 표현식 객체를 생성합니다. 이 클래스의 또 다른 정적 메소드는'.quote()'에서 사용되는 메소드로,'String'을 입력으로 사용하면 그 문자열에서 생성 된 정규식이 자동으로 유효하도록 모든 메타 문자를 인용합니다. [여기에'Pattern'을위한 전체 javadoc] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html). 참고 : 답변을 수락하는 것을 잊지 마십시오;) – fge

관련 문제