2014-03-28 1 views
1

이 문제로 얼마 동안 작업 한 후, 필요한 부분에 대해 Regex 구문을 알아 내는데 어려움이 있습니다.Java split을 사용하여 수학 표현식을 계산하십시오.

자바 강의에서는 표현식 문자열 (괄호의 유무에 관계없이)을 사용하고 올바르게 평가할 수있는 계산기를 작성하는 작업이 주어졌습니다.

식의 구문 분석 뒤에 개념은 당신이 문자열을 가지고있다

...

5+16/20-56+7-20*16/9

그리고 당신은 '분리'를 통해 두 ArrayLists를 얻으려면 :

{5,16,20,56,7,20,16,9} {+,/,-,+,-,*,/}

그런 다음 작업 우선 순위 순으로 작업을 조각 단위로 수행하고 ArrayList에서 숫자 배열 ha까지 작업을 비 웁니다 하나의 요소 : 최종 결과.

불행히도 Regex에 대한 경험이 없으므로 의 의미는 내가 읽고있는 자습서 및 예제의을 의미하지 않습니다.

나는 "[*-/+]"에 따라 분할하는 방법을 알아낼 수 없습니다, 나는가 아니라 단순한 숫자보다는 분할 전체 숫자을 선택하는 방법을 알아낼 수 없습니다. 이러한 오류 때문에 컴파일 할 코드를 가져올 수 없습니다. 코드의 하나의 작업 조각이 나는 거지 :

[Ljava.lang.String;@308ab721 

에서

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class Tester 
{ 
    public static void main(String[] args) 
    { 
     String expression = "3+5+6-10*20/150-14+76%2"; 

//  String[] operands = expression.split(""); 
     String[] operators = expression.split("[0-9]"); 

//  System.out.println(operands); 
     System.out.println(operators); 
    } 
} 

결과 그리고 그 출처 아무 생각이 없습니다.

누구든지 내가 뭘 잘못하고 있는지 알아낼 수 있습니까? 또는 Regex에서 초보자 용 강의을 매우 잘 가리 킵니까?

모두에게 감사드립니다.

답변

2

operandsoperators는이 array

당신이

System.out.println(Arrays.toString(operands)); 
System.out.println(Arrays.toString(operators)); 

을 할 수 array을 인쇄하는 것입니다 그리고 당신은 이런 식으로 분할한다 :

String[] operands = expression.split("[\\+\\-\\*\\%\\/]"); 
String[] operators = expression.split("[0-9]+"); 
+1

무해하기는하지만 첫 번째 패턴의 백 슬래시는 필요하지 않습니다. – ajb

+0

좋습니다. 수정했습니다. 하지만 그 좋은 연습은 정규 표현식 (begginner)에 대한 이스케이프 문자를 포함합니다. 이후 어떤 경우에는 그것은 필수입니다. 'replaceAll()'예 : – Baby

+0

죄송합니다.'-' 앞에 \\가 필요하므로 범위로 취급하지 않습니다. 나는 좋은 하루 보내지 않고있다. 잘못된 정보를 유감스럽게 생각합니다. – ajb

1

변수의 메모리 주소를 인쇄하고 있습니다. 당신이 문자열 표현을 원한다면, 당신은 무대 뒤에서 무슨 일

System.out.println(Arrays.toString(operators)); 

println() 방법은 전달 된 개체에 toString()를 호출된다 할 수 있습니다. Java에서 배열에 대한 toString()의 기본 구현은 메모리 주소를 반환하므로이 추악한 것을 인쇄 할 수 있습니다.

1

을 내가 전문가는 아니지만,이 당신을 위해 일해야합니다 :

public static void main(String[] args) 
{  
    String expression = "3+5+6-10*20/150-14+76%2"; 

    String[] operands = expression.split("[-+*%/]"); 
    String[] operators = expression.split("[0-9]+"); 

    System.out.println(Arrays.toString(operands)); 
    System.out.println(Arrays.toString(operators)); 
} 

Regex 메타 문자를 이스케이프 처리해야하며 (이 경우 주문을 변경하면됩니다.) 배열을 올바르게 인쇄해야합니다.

약간의 정교화 : 정규식에서

는 특정 문자는 특별한 의미를 가지고있다. 범위 0-9을 정의하여 대시를 메타 문자로 사용했습니다. -에도 동일하게 적용됩니다. here 전체 목록을 볼 수 있습니다.

실제로 수정 된 번호 일치 패턴에서 + 메타 문자 ("이전 하위 표현식과 일치합니다")를 사용하여 분리 된 빈 문자열 수를 줄였습니다. 이것은 을 하나 또는 여러 번 자리와 일치시켜 수행합니다. 단순히 숫자 또는 비 숫자라면

+1

(1) 대부분의 메타 문자가'[] '안에있을 때 이스케이프 처리 할 필요가 없습니다. 특히'+'와'*'는 대괄호 안에 특별한 의미가 없다. (2) 당신이 그들을 탈출했다면, 당신은 역 슬래시로 그것을 할 것입니다. 여기서 한 모든 것은 캐릭터 클래스에 슬래시를 5 번 넣는 것입니다.이 슬래시는 무해하지만 바보처럼 보입니다. – ajb

+0

@ajb 1 슬래시는 나누기 연산자입니다. 그리고 메타 문자를 두 배로 벗어나야한다고 생각했지만 잘못 생각했습니다. 고마워, 편집. – Azar

+0

글쎄, 당신은 4 개 대신 2 개의 여분의 슬래시가 있습니다. – ajb

0

는 정규식 간단

String[] operands = expression.split("\\D+"); 
String[] operators = expression.replaceAll("^\\d+", "").split("\\d+"); 

정규식 의미는 이하와 같다 :

  • \D+ 하나 이상의 비 - 숫자 (see demo)
  • \d+ 1 또는 더 많은 자릿수 (see demo)

replaceAll()을 호출하면 표현식에서 선행 숫자가 자르지 않으므로 첫 번째 연산자로 공백이 생기지 않습니다.

관련 문제