2013-10-03 4 views
3

22 + 4 * 3/4와 같은 문자열이 있습니다.문자열 토큰의 * 및/또는 Java 구분 기호

이제이 문자열에서 토큰을 추출해야합니다. 여기 내 한 줄의 코드입니다

String[] tokens = str.split([ +-*/]+) 

기본적으로 내 구분자 문자열입니다 [+ - * /] 나는 기호에 분할 할 것처럼 + - */

하지만 정규식 다음, 불행하게도,이 충돌 version of *,/ *와 /에 [/ - \ * \ /]를 추가하려고했지만 도움이되지 않습니다.

어떻게 Java 컴파일을 할 수 있습니까? 나는 패턴에 대한 자바 문서에 따라 완료했다고 생각했다. http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#sum

나는 무엇을 여기에서 놓쳤는가? character class[...]-에서

+1

시작 또는 끝에'- '을 넣으십시오. –

+0

도움을받지 못했습니다 : (어떻게 그 문제를 해결할 것입니까?) – adne

+0

덕분에 Delimanolis – adne

답변

3

을 시도, *+는 (결국 그들은 문자 클래스에있는 아무 의미가 없을 것)들은 특별한 의미를 잃게됩니다. 따라서 이러한 문자를 이스케이프 할 필요가 없습니다. 반대로, -은 문자 클래스에서 특별한 의미가 있지만, 문자 사이에 사용 된 경우에만 범위를 나타냅니다. 시작이나 끝에서 사용되면 특별한 의미가 없습니다. 그래서 우리는이 :

[ +*/-]+ 

Regular expression visualization

Debuggex Demo

+1

모두에게 감사합니다! 간결한 설명을 해주신 덕분에 @arshajii! – adne

2

감사는 특수 문자 a-z 같은 문자의 범위를 만드는 데 사용됩니다. 리터럴 문자로 만들려면 클래스 문자 [-...]의 시작 부분에 클래스 문자 [...-]의 끝 부분에 배치하거나 \으로 그냥 이스케이프해야합니다.이 경우 Java에서 "\\-"으로 작성해야합니다. 문자 클래스에서 사용하는 경우이 방법으로 사실

String[] tokens = str.split("[ +\\-*/]+"); 
0

당신이 당신의 문자열을 구문 분석하려고합니까? 내 생각 엔 입력 스트림의 어휘 분석 (스캐닝)을 수행하려고하는 것입니다.

  • strtok 및 문자 미리보기/푸시 백을 작성하여 스캐너를 손으로 돌릴 수 있습니다.
  • 당신은 렉스 같이했다 사용하거나, 당신은

당신이 당신의 대수를 토큰 화하고 싶어 가난한 망 파서 정규 표현식 및 사례 일련의 문장을 가정 할 수있는 어휘 스캐너

  • 을 구축 할 플렉스 수 끈. 문법과 인식 할 토큰을 정의해야합니다. BNF (Backus-Naur Formalism)와 같은 것이 필요하거나 '철도 구문 다이어그램'을 사용할 수 있습니다 (개인적으로 BNF를 선호하지만 철도 다이어그램을 좋아하는 사람들도 있습니다).이것은 무엇을 의미

    expression --> sexpr | nil 
    parenexpr --> '(' sexpr ')' 
    sexpr --> parenexpr | addexpr | thing | nil 
    addexpr --> mulexpr addop mulexpr | mulexpr 
    mulexpr --> parenexpr 
    thing --> symbol | integer | real | scientific 
    integer --> { '+' | '-' }? digit+ 
    real --> { '+' | '-' }? digit+ { . digit+ }? 
    scientific --> { + | - }? digit+ { . digit+ } e { '+' | '-' }? digit+ 
    addop --> '+' | '-' 
    mulop --> '/' | '*' | '^' | '%' 
    relop --> '||' | '&&' | '!' 
    symbol --> { character | '_' } { character | '_' | digit }* 
    digit --> [0-9] 
    character --> [A-Za-z] 
    //etc 
    

    문법 생산 기호의 왼쪽에있는 각 항목이다 (->)의 오른쪽에있는 것 중 하나로 확장 : 여기

    은 시작이다. 이 정의는 재귀 적이며, 필요한 프로그래밍 종류에 대한 아이디어를 제공합니다. 어쨌든 정수, 실제, 과학, 기호, addop, mulop, relop 및 추출 할 다른 토큰을 수집하기 위해 각 토큰을 스캔하고 식별해야합니다. 길을 따라 공백 (탭, 공백, 개행) 및 기타 정의되지 않은 기호를 처리하는 방법을 결정해야합니다.

  • 관련 문제