2012-11-07 10 views
5

że mamy ciągi typu:Jak przekonwertować ciąg znaków na obiekt BinaryExpression?

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

chcę przekonwertować te ciągi do BinaryExpression obiekty podobne do tego, co możemy uzyskać stosując:

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))); 

stworzyłem poniższą metodę:

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"); 
} 

Jednak powyższa metoda nie działa poprawnie, jeśli na przykład mamy ciągi takie jak:

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' 

Jaki jest najprostszy sposób, aby był bardziej solidny i niezawodny?

+2

będziesz używać tylko>, <,=,<=,> =, =>, =

+0

@KrishanuDey: yes –

Odpowiedz

2

Jak Harsha wskazał go regex stałaby zadanie proste

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

, ale to zwróci wartość false, jeśli ciąg znaków zawiera dowolną przestrzeń –

+0

, to znaczy użyłem '\ s *' w wyrażeniu dopasowanym do 0 lub większej liczby spacji – Anirudha

+0

działa zgodnie z oczekiwaniami. dzięki! –

2

Stosuj wyrażenie regularne, aby dopasować do niektórych typów możliwych wyrażeń (jeśli masz wyczerpującą i względnie krótką listę możliwych wyrażeń). Przetwórz ciąg, jeśli nie pasuje do wyrażenia regularnego, aby sprawdzić nieoczekiwane znaki.

EDYCJA: Polecenie regex i parsowanie pomoże ci "wyczyścić" strunę, zanim będziesz mógł użyć przełącznika/jeśli-else.

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