/ / Подрязване на математически израз - c #, regex, trim

Подрязване на математически израз - c #, regex, trim

Имам Regex: [-]? D + [- +^ / Г] и този ред на кода:

foreach(Match m in Regex.Matches(s, "[-]?d+[-+*^/d]*")){
...
}

m.Value = (например) 2 + 4 * 50

Има ли начин да получите струнен масив под формата на {"2", "+", "4", "*", "50"}?

Отговори:

3 за отговор № 1

На първо място, имахте грешен регулярен израз. Имате реге, който съответства на цял string, но искате да разделите низа на границите на токена, така че искате да разпознавате символите.

Второ, не се опитвайте да решите проблема дали - е unary минус или оператор в lex време. Това е проблем за анализа.

Трето, можете да използвате обикновени LINQ оператори, за да превърнете колекцията от мачове в масив от низове.

Сложете всичко заедно:

    string s = "10*20+30-40/50";
var matches =
Regex.Matches(s, @"d+|[-+*/]")
.Cast<Match>()
.Select(m => m.Value)
.ToArray();

Тази техника работи само ако вашата лексикална граматика е редовна, а много не са. (И дори някои езици, които са технически редовно е неудобно да се характеризира като регулярен израз.) Както отбелязах в един коментар: написването на лексика не е трудно. Обмислете просто да напишете lexer, а не да използвате регулярни изрази.


0 за отговор № 2

Можете да опитате разделяне на границата на думите

 var st = "2+4*50";

var li = Regex.Split(st, @"b");

foreach (var i in li)
Console.WriteLine(i);
2
+
4
*
50