如何在字符串中的条件运算符之前和之后添加空间?

时间:2018-11-15 06:39:14

标签: c# string c#-4.0

我有字符串,例如“ number1 <= number2 && number3> number4 || number2 = number4 ”,并且运算符列表为-

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 :(得分:3)

我建议使用正则表达式解决方案。

首先,您需要转义所有运算符,并与|一起加入它们:

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名称空间之内。

Demo

答案 1 :(得分:1)

我不确定这是否是最有效的方法,但是通过使用replace会很简单

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

    return expression;
 }