Мне нужно распарсить строку. Она может иметь один из вот таких видов:
0²
0²(+,-,*)0
0(+,-,*)0²
Где:
0 - число в диапазоне [1;50]
² - степень числа перед этим знаком. Мне нужно получить то число, которое стоит до этого знака.
(+,-,*) - на этом месте может быть или +, или -, или *. Никакого другого знака там стоять не может.
Не могу получить число, которое возводиться в степень. Можно сделать вот так:
int x = Convert.ToInt32(expression [expression.IndexOf('²') - 1]);
Но такой подход негибкий, так как число может быть больше 10.
Вижу, некоторые не совсем поняли что я от вас хочу).
"10+13²"
"11+4²"
"43²+3"
13
4
43
Как мне усовершенствовать мой метод, что бы он находил полностью число, даже если оно больше 10?
Вы можете использовать регулярное выражение такого вида: (?<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);
}
Для полной обработки можно сделать простой конечный автомат, обрабатывающий символ за символом.
В начальном состоянии A значение V = 0
Получили цифру digit
- вернулись в то же состояние, модифицировали
V = V * 10 + digit
Получили цифру в верхнем регистре - это степень, накопленное значение V -подстепенное число, перешли в состояние B, ожидаем конца строки или арифметического символа, или что там ещё возможно.
Если в состоянии A получили арифметический символ - записали накопленное число, перешли в состояние C, значение V сбрасываем в 0, ждём цифру и т.д.
Главное- правильно расписать возможные состояния и переходы
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как можно узнать куда был перенаправлен запрос HttpClient если для запроса указывать только запрос заголовков?
когда залил сайт на хостинг столкнулся с ошибкой
на сайте стоит модуль JCE Editor, проблема в том, когда в админке мы редактируем текст он выглядит нормально, например выделяем желтым, делаем...