如何在字符串中的条件运算符前后添加空格



我有一个字符串,例如">number1<=number2&&number3>number4||number2=number4",运算符列表为-

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

因此,期望在字符串中的每个运算符前后引入一个空格。

">number1<=number2&&number3>number4||number2=number4">

我尝试了以下代码,但不起作用,例如,<,>=

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

注意:操作员列表是随机的。

任何帮助都将不胜感激!

我建议使用regex解决方案。

首先,您需要逃离所有操作员,将他们与|:连接在一起

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.

接下来,创建regex:

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

使用问题中的operators数组,数组如下所示:

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

注意,s*用于检查运算符是否已被空格包围。如果是,这些空格将被匹配和替换。

替换为:

 $1 

代码:

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

注意前导空格和尾随空格。

还要注意,Regex位于System.Text.RegularExpressions名称空间内。

演示

我不确定这是否是最有效的方法,但使用替换非常简单

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

最新更新