Как мне разобрать строку, представляющую последовательность арифметических операций? - PullRequest
0 голосов
/ 25 сентября 2011

Я работаю над личным проектом, и я хочу получить userinput, который выглядит следующим образом:

   1.0+2.5+3--4 

и отформатируйте его примерно так:

   1.0 + 2.5 + 3 - -4  

До сих пор я использую .replace ("+") для .replace ("+") и делаю это для всех операндов, но проблема в том, что он делает ввод пользователем в это:

  1.0 + 2.5 + 3 - - 4 

Есть ли способ, которым я могу сделать это с отрицательными знаками. Я хочу сделать это, чтобы я мог разобрать числа в двойные, а затем сложить и вычесть их.

мой код для него:

  import java.util.Scanner;
   import java.util.regex.Matcher;
   import java.util.regex.Pattern;


public class StringMan {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    String check = "-a1 +a2 +       a3 +-a5";
    check  = check.replace("--", "+");
    System.out.println(check);
    Pattern pattern = Pattern.compile("\\s+");
      Matcher matcher = pattern.matcher(check);
      boolean expr = matcher.find();
      String str = matcher.replaceAll(" ");
      System.out.println(str);



}

   }

вывод:

   -a1 +a2 -       a3 +-a5
   -a1 +a2 - a3 +-a5

проблема в том, что я хочу, чтобы вывод выглядел так: -a1 + a2 - a3 + -a5

Ответы [ 4 ]

1 голос
/ 25 сентября 2011

В этом конкретном случае вы можете обработать --, просто заменив их на +:

  1. Принять ввод как строку от пользователя
  2. Удалить все пробелы
  3. Заменить все -- на +
  4. Продолжить анализ по желанию
0 голосов
/ 26 ноября 2013

Проверьте это, Читайте как строки, так и целые числа между операторами, такими как '*, -, -, + " Мы можем читать как целые числа, так и символы.

public static void main(String[] args) {
    // TODO Auto-generated method stub
    final Pattern remainingPatWithExt=Pattern.compile("(\\p{L}\\p{M}*)[\\p{L}\\p{M}0-9^\\-.-?_+-=<>!;]*");
    String check = "a1+a2+--a7+    a3 +-a5";

      Matcher matcher = remainingPatWithExt.matcher(check);
      while( matcher.find())
      {
          System.out.println(matcher.group()); 
            //use  matcher.group(0) or matcher.group(1)
      }

}

выход

a1 a2 a7 a3 a5

0 голосов
/ 25 сентября 2011

Я бы порекомендовал использовать регулярные выражения и их "групповую" функциональность.Я бы на самом деле удалил все пробелы, чтобы сделать вещи проще, вычеркнул бы это из уравнения, еще одну вещь, с которой нужно иметь дело.И, очевидно, я бы порекомендовал упростить строку, заменив "-" на "+", "* +" на "*" и т. Д.

теперь вы можете использовать регулярное выражение в вашей очищенной строке.

Pattern firstPat = Pattern.compile("(((\\+|-)?)\\d+(.\\d+)?)");//for matching the first number, leading sign is optional
Pattern remainingPat = Pattern.compile("(\\+|-)(\\d+(.\\d+)?)");//for remaining numbers, leading sign is mandatory.
Pattern remainingPatWithExtOps = Pattern.compile("(\\*|/|\\+|-)(-?\\d+(.\\d+)?)");//for remaining numbers, accommodating multiply and divide with negative signs(positive signs should have been cleaned out)

Matcher match = firstPat.matcher(inputString);

теперь вы можете перебирать строку, используя метод match.find().а затем используйте match.group(1), чтобы получить знак / операцию, и используйте match.group(2), чтобы получить число ...

Итак ...

Double firstnum;
boolean firstNumSigned = false;
if(match.find())
{
    firstNum = Double.parse(match.group(0));// Parsing handles possible sign in string. 
    //obv check for exceptions during this and double check group num
    String tmp = match.group(1);
    firstNumSigned = tmp.equals("+") || tmp.equals("-");
}
else
{//no match means the input was probably invalid....
    throw new IllegalArgumentException("What the heck were you thinking inputting that?!");
}
match = remainingPat.matcher(inputString);//use our other pattern for remaining numbers
if(firstNumSigned)
{
    match.find();//a signed first number will cause success here, we need to ignore this since we already got the first number
}
Double tmpRemaingingNum;
String operation;
while(match.find())
{
    operation = match.group(1);
    tmpRemainingNum = Double.parse(match.group(2));
    //Do what you want with these values now until match.find() returns false and you are done
}

PS: код не проверенЯ довольно уверен в регулярном выражении, но я не уверен на 100% насчет группирующих скобок на первом шаблоне .. возможно, придется поэкспериментировать

0 голосов
/ 25 сентября 2011

Начните с замены - на +, что математически эквивалентно. Или начните с замены - на - - что бы сохранить - и 4 вместе.

...