5

次のような文字列があるとします。

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

このような文字列を BinaryExpression オブジェクトに変換して、以下を使用して得られるものと同様にしたいと考えています。

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

以下のメソッドを作成しました。

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

ただし、たとえば次のような文字列がある場合、上記の方法は正しく機能しません。

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'

より堅牢で信頼性の高いものにする最も簡単な方法は何ですか?

4

2 に答える 2

2

正規表現を使用して、可能な式のいくつかのタイプと照合します (可能な式の網羅的でかなり短いリストがある場合)。また、正規表現と一致しない場合は文字列を解析して、予期しない文字がないかどうかを確認します。

編集: 正規表現と解析は、switch/if-else ケースを使用する前に文字列を「きれいにする」のに役立ちます。

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

于 2012-11-07T13:08:48.050 に答える
2

ハルシャが指摘したように、それregexはあなたの仕事を簡単にするでしょう

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
于 2012-11-07T13:47:22.473 に答える