【问题标题】:How to add a space before and after conditional operator in a string?如何在字符串中的条件运算符前后添加空格?
【发布时间】:2020-04-02 14:48:30
【问题描述】:

我有一个字符串,例如 "number1number4||number2=number4" 并且运算符列表为 -

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

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

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

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

任何帮助将不胜感激!

【问题讨论】:

  • 你可以通过 "(" + string.Join("|", operator.Select(Regex.Escape)) + ")" 构造一个正则表达式,然后做一个 regex.Replace

标签: c# string c#-4.0


【解决方案1】:

我会推荐一个正则表达式解决方案。

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

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

【讨论】:

  • 对于“如果运算符已经被空格包围”,可能是一个更好的选择\s* 而不是\s?(如果我们有几个空格"a___&gt;=__b" ?)
  • @Sweeper - 感谢您的建议。
【解决方案2】:

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

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

    return expression;
 }

【讨论】:

  • 感谢您的建议,但如果出现像“number1
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多