Workflow Foundation: c# parse 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" }

Я буду сообщать любые предложения или идеи.

2 ответа

  1. Я нашел решение:

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

    Введите описание изображения здесь

  2. 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();
            }
        }
    }