2016-12-29 5 views
0

からC#​​の解析VB式:ワークフロー財団:私は次の文字列からVBの式を計算する必要がある文字列

"stringVar1 = \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33" 

"stringVar1= \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33" 

"stringVar1 = \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33" 

私はクラス

Variableがある
public class ExpressionUnit 
    { 
     public string Variable { get; set; } 
     public string Operator { get; set; } 
     public string Value { get; set; } 
    } 

の変数の配列にそれを解析する必要があります"stringVar1"、Operatorは "="、Valueは "stringVar1Value"です。 厳密順序と文字列の配列:

{ "stringVar1", "=", "stringVar1Value", "and", "boolVar1", "<>", "False", "or", "intVar1", "=", "22", "and", "intVar2", "=", "33" } 

私は、任意の提案やアイデアをappritiateます。

+0

文字列の分割が、可能なスペースは混乱を作ります。 –

+1

これは過度なことかもしれませんが、おそらくRoslynが助けてくれるかもしれません:https://github.com/dotnet/roslyn/wiki/Getting-Started-VB-Syntax-Analysis –

+0

おそらくこのようなものでしょうか? http://stackoverflow.com/questions/4629/how-can-i-evaluate-c-sharp-code-dynamically –

答えて

0

私はいくつかの解決策を見つけた:

public static class StringParser 
{ 
    public static List<string> ParseExpression(string expression) 
    { 
     //expression = System.Text.RegularExpressions.Regex.Replace(expression, @"\s+", " "); 

     string word = string.Empty; 
     int i = 0; 
     List<string> list = new List<string>(); 
     while (i < expression.Length) 
     { 
      if (expression[i] == ' ') 
      { 
       if (!string.IsNullOrEmpty(word)) 
       { 
        list.Add(word); 
        word = string.Empty; 
       } 
       i++; 
       continue; 
      } 
      if (expression[i] == '=') 
      { 
       if (!string.IsNullOrEmpty(word)) 
       { 
        list.Add(word); 
       } 
       word = new string(expression[i], 1); 
       list.Add(word); 
       word = string.Empty; 
       i++; 
       continue; 
      } 
      if (expression[i] == '<') 
      { 
       if (!string.IsNullOrEmpty(word)) 
       { 
        list.Add(word); 
       } 
       word = new string(expression[i], 1); 
       i++; 
       word += expression[i]; 
       list.Add(word); 
       word = string.Empty; 
       i++; 
       continue; 
      } 

      word += expression[i]; 
      i++; 
      if (!string.IsNullOrEmpty(word) && i == expression.Length) 
      { 
       list.Add(word); 
      } 
     } 

     return list; 
    } 
} 

単体テストはそれが動作することを証明:

[TestFixture] 
public class VbExpressionParserTests 
{ 
    [Test] 
    public void VbExpressionParserTests_ParseExpression_String_List1() 
    { 
     string[] correctResult = { "stringVar1", "=", "\"stringVar1Value\"", "and", "boolVar1", "<>", "False", "or", "intVar1", "=", "22", "and", "intVar2", "=", "33" }; 
     string[] res = StringParser.ParseExpression("stringVar1 = \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33").ToArray(); 
     CollectionAssert.AreEqual(correctResult, res); 
    } 
    [Test] 
    public void VbExpressionParserTests_ParseExpression_String_List2() 
    { 
     string[] correctResult = { "stringVar1", "=", "\"stringVar1Value\"", "and", "boolVar1", "<>", "False", "or", "intVar1", "=", "22", "and", "intVar2", "=", "33" }; 
     string[] res = StringParser.ParseExpression("stringVar1= \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33").ToArray(); 
     CollectionAssert.AreEqual(correctResult, res); 
    } 
    [Test] 
    public void VbExpressionParserTests_ParseExpression_String_List3() 
    { 
     string[] correctResult = { "stringVar1", "=", "\"stringVar1Value\"", "and", "boolVar1", "<>", "False", "or", "intVar1", "=", "22", "and", "intVar2", "=", "33" }; 
     string[] res = StringParser.ParseExpression("stringVar1 = \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33").ToArray(); 
     CollectionAssert.AreEqual(correctResult, res); 
    } 

    [Test] 
    public void VbExpressionParserTests_ParseExpression_String_IdealExpression() 
    { 
     string[] correctResult = { "stringVar1", "=", "\"stringVar1Value\"", "and", "boolVar1", "<>", "False", "or", "intVar1", "=", "22", "and", "intVar2", "=", "33" }; 
     string[] res = StringParser.ParseExpression("stringVar1=\"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33").ToArray(); 
     CollectionAssert.AreEqual(correctResult, res); 
    } 
} 

enter image description here

0
using System.Diagnostics; 
using System.Text.RegularExpressions; 

namespace MrB 
{ 
    class Program 
    { 
     static void Main() 
     { 
      string s1 = "stringVar1 = \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33"; 
      string s2 = "stringVar1= \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33"; 
      string s3 = "stringVar1 = \"stringVar1Value\" and boolVar1<>False or intVar1=22 and intVar2=33"; 

      var rgx = new Regex("="); 
      var replacement = " = "; 

      string s1b = rgx.Replace(s1, replacement); 
      string s2b = rgx.Replace(s2, replacement); 
      string s3b = rgx.Replace(s3, replacement); 

      rgx = new Regex(@"\s+"); 
      replacement = " "; 

      string s1c = rgx.Replace(s1b, replacement); 
      string s2c = rgx.Replace(s2b, replacement); 
      string s3c = rgx.Replace(s3b, replacement); 

      string[] s1List = s1c.Split(' '); 
      string[] s2List = s2c.Split(' '); 
      string[] s3List = s3c.Split(' '); 

      Debugger.Break(); 
     } 
    } 
} 
+0

すなわち 1)すべての等号を見つけ、両側のスペースで置き換えます。 2)複数のスペースをすべて1つのスペースに置き換えます。 3)スペースを分割します。 –

関連する問題