Как спроектировать и разделить токены из функции строкового токенизатора? - PullRequest
1 голос
/ 30 июня 2019

Я строю калькулятор, который может решать формулы как мой проект, в котором я столкнулся с проблемой, что строка, такая как 2x + 7, будет маркирована как "2x", "+", "7".

Мне нужно правильно разделить его на константы и переменные, что означает, что 2x должно быть «2», «x». Как мне это сделать, не затрагивая даже сложные формулы, которые включают функции Sin и Cos и т. Д.

Например, я хочу, чтобы 16x + cos (y) были маркированы как "16", "x", "+", "cos", "(", "y", ")"

1 Ответ

0 голосов
/ 30 июня 2019

Эта проблема была бы довольно сложной, и этот ответ является лишь примером.

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

([a-z]+)|([-]?\d+)|[-+*\/]

Демо 1

Или:

([a-z]+)|([-]?\d+)|([-+*\/])|(\(|\))

Демо 2

Пример

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

final String regex = "([a-z]+)|([-]?\\d+)|([-+*\\/])";
final String string = "2x+7\n"
     + "2sin(2x + 2y) = 2sin(x)*cos(2y) + 2cos 2x * 2sin 2y\n"
     + "2sin(2x - 2y) = -2tan 2x / cot -2y + -2cos -2x / 2sin 2y\n";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

У меня действительно нет никаких предложений относительно того, как было бы лучше разработать решение для этой проблемы. Но, возможно, вы захотите сначала классифицировать ваши уравнения, а затем спроектировать некоторые классы / методы для обработки каждой интересующей категории, и там, где необходимо регулярное выражение, вы, вероятно, можете разработать одно / несколько выражений для желаемых целей, которые вы хотите достичь.

...