Как получить полное число перед знаком

125
02 июля 2019, 18:30

Мне нужно распарсить строку. Она может иметь один из вот таких видов:

0²
0²(+,-,*)0
0(+,-,*)0²

Где:

0 - число в диапазоне [1;50]

² - степень числа перед этим знаком. Мне нужно получить то число, которое стоит до этого знака.

(+,-,*) - на этом месте может быть или +, или -, или *. Никакого другого знака там стоять не может.

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

int x = Convert.ToInt32(expression [expression.IndexOf('²') - 1]);

Но такой подход негибкий, так как число может быть больше 10.

Вижу, некоторые не совсем поняли что я от вас хочу).

Пример

INPUT

"10+13²"
"11+4²"
"43²+3"

OUTPUT

13
4
43

Как мне усовершенствовать мой метод, что бы он находил полностью число, даже если оно больше 10?

Answer 1

Вы можете использовать регулярное выражение такого вида: (?<DigitValue>[^\D]+)²

Где DigitValue — название группы.

Чтобы использовать такой вариант, вам необходимо завести один объект Regex:

Regex digitDataRegex = new Regex("(?<DigitValue>[^\\D]+)²",
    RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);

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

string inputData = "2²\r\n3²(+,-,*)6\r\n1(+,-,*)7²\r\n\r\n10+13²\r\n11+4²\r\n43²+3";
Regex digitDataRegex = new Regex("(?<DigitValue>[^\\D]+)²",
    RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
MatchCollection dataCollection = digitDataRegex.Matches(inputData);
foreach (Match match1 in dataCollection)
{
    Console.WriteLine("Founded digit value: {0} at index {1} match data is {2}",
                match1.Groups["DigitValue"].Value, match1.Index, match1);
}
Answer 2

Для полной обработки можно сделать простой конечный автомат, обрабатывающий символ за символом.

В начальном состоянии A значение V = 0

Получили цифру digit - вернулись в то же состояние, модифицировали

V = V * 10 + digit

Получили цифру в верхнем регистре - это степень, накопленное значение V -подстепенное число, перешли в состояние B, ожидаем конца строки или арифметического символа, или что там ещё возможно.

Если в состоянии A получили арифметический символ - записали накопленное число, перешли в состояние C, значение V сбрасываем в 0, ждём цифру и т.д.

Главное- правильно расписать возможные состояния и переходы

READ ALSO
Узнать куда было перенаправление

Узнать куда было перенаправление

Как можно узнать куда был перенаправлен запрос HttpClient если для запроса указывать только запрос заголовков?

155
Fatal error: Uncaught Error: Class &#39;application\core\view&#39; not found На хостинге

Fatal error: Uncaught Error: Class 'application\core\view' not found На хостинге

когда залил сайт на хостинг столкнулся с ошибкой

173
Изменение настроек JCE Editor

Изменение настроек JCE Editor

на сайте стоит модуль JCE Editor, проблема в том, когда в админке мы редактируем текст он выглядит нормально, например выделяем желтым, делаем...

146
При копировании файла создается папка

При копировании файла создается папка

Есть массив с адресами и названием файлов

118