2012-11-07 15 views
5

sagen, wir haben Strings wie:Wie konvertiert man eine Zeichenfolge in ein BinaryExpression-Objekt?

string s1 = "a < 5"; 
string s2 = "b >= 7"; 
string s3 = "c <= 8"; 
... 

Ich möchte solche Strings in Binary auf ähnliche Objekte konvertieren, was wir bekommen, indem Sie:

BinaryExpression b1 = Expression.MakeBinary(ExpressionType.LessThan, Expression.Parameter(typeof(int), "a"), Expression.Constant(5, typeof(int))); 
    BinaryExpression b2 = Expression.MakeBinary(ExpressionType.GreaterThanOrEqual, Expression.Parameter(typeof(int), "b"), Expression.Constant(7, typeof(int))); 
    BinaryExpression b3 = Expression.MakeBinary(ExpressionType.LessThanOrEqual, Expression.Parameter(typeof(int), "c"), Expression.Constant(8, typeof(int))); 

Ich habe die folgende Methode erstellt:

BinaryExpression ConvertStringToBinaryExpression(string exp) 
{ 
    string[] s = exp.Split(' '); 
    string param = s[ 0 ]; 
    string comparison = s[ 1 ]; 
    int constant = int.Parse(s[ 2 ]); 
    if (comparison == "<") 
    return Expression.MakeBinary(ExpressionType.LessThan, Expression.Parameter(typeof (int), param), Expression.Constant(constant, typeof (int))); 
    else if (comparison == "<=") 
    return Expression.MakeBinary(ExpressionType.LessThanOrEqual, Expression.Parameter(typeof (int), param), Expression.Constant(constant, typeof (int))); 
    else if (comparison == ">") 
    return Expression.MakeBinary(ExpressionType.GreaterThan, Expression.Parameter(typeof (int), param), Expression.Constant(constant, typeof (int))); 
    else if (comparison == ">=") 
    return Expression.MakeBinary(ExpressionType.GreaterThanOrEqual, Expression.Parameter(typeof (int), param), Expression.Constant(constant, typeof (int))); 
    else 
    throw new ArgumentException("Invalid expression.", "exp"); 
} 

Die obige Methode funktioniert jedoch nicht ordnungsgemäß, wenn wir beispielsweise Zeichenfolgen wie:

haben
string s4 = "a< 5" // no space between 'a' and '<' 
string s5 = "b>=9" // no space at all 
string s6 = "c <=7" // no space betwen '<=' and '7' 

Was ist der einfachste Weg, um es robuster und zuverlässiger zu machen?

+2

werden Sie verwenden nur die>, <,=,<=,> = => =

+0

@KrishanuDey: ja –

Antwort

2

Wie Harsha darauf hingewiesen, regex einfach Ihre Aufgabe

Match m=Regex.Match("var4 <= 433",@"(?'leftOperand'\w+)\s*(?'operator'(<|<=|>|>=))\s*(?'rightOperand'\w+)"); 
m.Groups["leftOperand"].Value;//the varaible or constant on left side of the operator 
m.Groups["operator"].Value;//the operator 
m.Groups["rightOperand"].Value;//the varaible or constant on right side of the operator 
+0

, aber das wird false zurückgeben, wenn die Zeichenfolge Leerzeichen enthält –

+0

das ist y Ich habe '\ s *' in der Regex verwendet, um 0 oder mehr Leerzeichen zu entsprechen – Anirudha

+0

funktioniert wie erwartet. Vielen Dank! –

2

Verwenden Sie Regex, um mit einigen Arten von möglichen Ausdrücken übereinzustimmen (wenn Sie eine erschöpfende und einigermaßen kurze Liste möglicher Ausdrücke haben). Parsen Sie die Zeichenfolge auch, wenn sie nicht mit Ihrer Regex übereinstimmt, um nach unerwarteten Zeichen zu suchen.

EDIT: Die Regex und Parse hilft Ihnen, die Zeichenfolge "reinigen", bevor Sie Ihre Switch/If-else-Fall verwenden können.

http://www.c-sharpcorner.com/UploadFile/prasad_1/RegExpPSD12062005021717AM/RegExpPSD.aspx

Verwandte Themen