我有字符串,例如“ 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;
}
注意:操作员列表随机出现。
任何帮助表示赞赏!
答案 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
名称空间之内。
答案 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;
}