2016-12-29 65 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" 

我需要将其解析到的类

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

的变量数组,其中Variable是“stringVar1”,Operator是“=”,Value是“stringVar1Value”。 或严格排序的字符串数组:

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

我会提出任何建议或意见。

+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)用单个空格替换所有多个空格 3)在空格上拆分 - 赋予13个元素 –