Как добавить пробел до и после условного оператора в строке? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть строка, например, " число1 <= число2 && число3> число4 || число2 = число4 " и список операторов имеет вид -

var operators = new List<string> {"=", "!", "<", ">", ">=", "<=", "!=","||","&&"};

Таким образом, ожидание необходимо ввести один пробел до и после оператора в строке.

" номер1 <= номер2 && номер3> номер4 || номер2 = номер4 "

Я попробовал следующую опцию, но она не работает в случае, например. <,> =

    public static string AddSpaceBeforeAndAfterOperator(string expression)
    {
                var operators = new List<string> {"=", "!", "<", ">", ">=", "<=", "!=", "||", "&&"};
                foreach (var op in operators)
                {
                    var index = expression.IndexOf(op, StringComparison.Ordinal);
                    if (index >= 0)
                    {
                        if (expression.Substring(index - 1) != " ")
                        {
                            expression = expression.Insert(index-1, " ");
                        }

                        expression = expression.Insert(index + op.Length + 1, " ");
                    }
                }

                return expression;
}

Примечание: список операторов будет случайным.

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я бы порекомендовал решение для регулярных выражений.

Во-первых, вам нужно покинуть все свои операторы, объедините их вместе с |:

var operatorsString = string.Join("|", 
    operators.OrderByDescending(x => x.Length).Select(Regex.Escape).ToArray()
);
// OrderByDescending here because we want the longer operators to be matched first.

Затем создайте регулярное выражение:

var regex = $"\\s*({operatorString})\\s*";

Используя массив operators в вопросе, массив выглядит следующим образом:

\s*(<=|>=|!=|==|\|\||&&|=|!|<|>)\s?*

Обратите внимание, что \s* используется для проверки того, что оператор уже окружен пробелами,Если это так, эти пробелы будут сопоставлены и заменены.

Замена:

 $1 

Код:

Regex.Replace(input, regex, " $1 ");

Обратите внимание на начальные и конечные пробелы.

Также обратите внимание, что Regex находится внутри пространства имен System.Text.RegularExpressions.

Демо

0 голосов
/ 15 ноября 2018

Я не уверен, что это самый эффективный способ сделать это, но он прост в использовании замены

public static string AddSpaceBeforeAndAfterOperator(string expression)
{
    var operators = new List<string> { "=", "!", "<", ">", ">=", "<=", "!=", "||", "&&" };
    foreach (var op in operators)
    {
        expression = expression.Replace(op, " " + op + " ");
    }

    return expression;
 }
...