2 votes

Comment ajouter un espace avant et après l'opérateur conditionnel dans une chaîne de caractères?

J'ai une chaîne par exemple "numéro1<=numéro2&&numéro3>numéro4||numéro2=numéro4" et ayant une liste d'opérateurs comme -

var opérateurs = new List {"=", "!", "<", ">", ">=", "<=", "!=", "||", "&&"};

Par conséquent, l'attente est d'ajouter un seul espace avant et après chaque opérateur dans la chaîne.

"numéro1 <= numéro2 && numéro3 > numéro4 || numéro2 = numéro4"

J'ai essayé le code suivant mais cela ne fonctionne pas par exemple pour <, >=

public static string AjouterEspaceAvantEtApresOperateur(string expression) {
  var opérateurs = new List {"=", "!", "<", ">", ">=", "<=", "!=", "||", "&&"};
  foreach (var op in opérateurs) {
    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;
}  

Remarque : La liste des opérateurs est aléatoire.

Toute aide serait appréciée!

3voto

Sweeper Points 1267

Je recommanderais une solution regex.

Tout d'abord, vous devez échapper tous vos opérateurs, les joindre ensemble avec |:

var operatorsString = string.Join("|", 
    operators.OrderByDescending(x => x.Length).Select(Regex.Escape).ToArray()
);
// OrderByDescending ici car nous voulons que les opérateurs les plus longs soient d'abord correspondus.

Ensuite, créez la regex:

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

En utilisant le tableau operators dans la question, le tableau ressemble à ceci:

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

Notez que \s* est utilisé pour vérifier si l'opérateur est déjà entouré d'espaces. S'il l'est, ces espaces seront correspondus et remplacés.

Le remplacement est:

 $1 

Code:

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

Notez l'espace initial et final.

Notez également que Regex est à l'intérieur de l'espace de noms System.Text.RegularExpressions.

Démo

1voto

Daniel W. Points 236

Je ne suis pas sûr que ce soit la manière la plus efficace de faire cela, mais c'est vraiment simple en utilisant replace.

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

    return expression;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X