Как разобрать строку с Java? - PullRequest
2 голосов
/ 14 ноября 2011

Я пытаюсь сделать простое приложение калькулятора, которое будет принимать строку вроде этой

5 + 4 + 3 - 2 - 10 + 15

Мне нужна Java для разбора этой строки в массив

{5, +4, +3, -2, -10, +15}

Предположим, что пользователь может ввести 0 или более пробелов между каждым числом и каждым оператором

Я новичок в Java, поэтому не совсем уверен, как этого добиться.

Ответы [ 6 ]

0 голосов
/ 14 ноября 2011

Исходя из ввода некоторых ответов, я нашел, что это лучшее решение

// input
String s = "5 + 4 + 3 - 2 - 10 + 15";
ArrayList<Integer> numbers = new ArrayList<Integer>();

// remove whitespace
s = s.replaceAll("\\s+", "");

// parse string
Pattern pattern = Pattern.compile("[-]?\\d+");
Matcher matcher = pattern.matcher(s);

// add numbers to array
while (matcher.find()) {
  numbers.add(Integer.parseInt(matcher.group()));
}

// numbers
// {5, 4, 3, -2, -10, 15}
0 голосов
/ 14 ноября 2011
    String cal = "5 + 4 + 3 - 2 - 10 + 15";
    //matches combinations of '+' or '-', whitespace, number
    Pattern pat = Pattern.compile("[-+]{1}\\s*\\d+");
    Matcher mat = pat.matcher(cal);
    List<String> ops = new ArrayList<String>();
    while(mat.find())
    {
        ops.add(mat.group());
    }
    //gets first number and puts in beginning of List
    ops.add(0, cal.substring(0, cal.indexOf(" ")));

    for(int i = 0; i < ops.size(); i++)
    {
        //remove whitespace
        ops.set(i, ops.get(i).replaceAll("\\s*", ""));
    }

    System.out.println(Arrays.toString(ops.toArray()));
    //[5, +4, +3, -2, -10, +15]
0 голосов
/ 14 ноября 2011

Вы можете использовать позитивный взгляд:

    String s = "5  +  4  +  3   -   2 - 10 + 15";
    Pattern p = Pattern.compile("(?<=[0-9]) +");
    String[] result = p.split(s);

    for(String ss : result)
        System.out.println(ss.replaceAll(" ", ""));
0 голосов
/ 14 ноября 2011

Пусть str будет вашим линейным буфером.

Используйте Regex.match для шаблона ([-+]?[ \t]*[0-9]+).

Суммируйте все совпадения в String[] tokens.

Затем,за каждый token в tokens:

String s[] = tokens[i].split(" +");
if (s.length > 1)
    tokens[i] = s[0] + s[1];
else
    tokens[i] = s[0];
0 голосов
/ 14 ноября 2011

Взгляните на String.split () :

String str = "1 + 2";
System.out.println(java.util.Arrays.toString(str.split(" ")));

[1, +, 2]

Обратите внимание, что split использует регулярные выражения, поэтому вам нужно заключить символ в кавычки для разделения на "." или аналогичные символы с особым значением. Кроме того, несколько пробелов в строке будут создавать пустые строки в массиве разбора, который вам нужно будет пропустить.

Это решает простой пример. Для более точного разбора истинных выражений вам нужно создать грамматику и использовать что-то вроде Antlr .

0 голосов
/ 14 ноября 2011

Вы можете использовать Integer.parseInt, чтобы получить значения, разделяя строку, которую вы можете получить с помощью класса String.Регулярное выражение может работать, но я не знаю, как это сделать: 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...