2017-03-27 1 views
1

C# Visual Studio 17Comment faire un delimiter en C# et prendre la valeur

simplement supposer que j'ai une chaîne qui a la valeur [3-4 + 6 * 2] ou même [3-4 + 20- 0,5] ... et je veux qu'ils soient stockés dans un tableau de chaînes ... Je l'ai fait des recherches et constaté que l'utilisation Split, début garniture, couper fin Nous pouvons les séparer ...

.TrimStart('[') 
.TrimEnd(']') 
.Split('-','*','+'); 

Mais je ne pouvais pas trouver si nous pouvons faire cela Je veux dire

Mais je ne pouvais pas trouver nulle part comment stocker le délimiteur s aussi mais demandez-leur de faire leur travail (je voulais dire séparer) !!

La valeur stockée sera {3, 4, 6, 2} mais je veux ceci {3, -, 4, +, 6, *, 2} et que faire des zéros extraordinaires !!! ?

+1

Veuillez mettre à jour votre question avec le scénario le plus défavorable et le résultat attendu. Peut-être [-0.5 * 1,000.5 + 5,000- (7 + 5)] => ??? –

Répondre

1

Dans général cas, vous devez utiliser un analyseur; si vous voulez juste pour partager et préserver le délimiteur, s'il vous plaît, jetez un oeil à Regex.Split:

string source = "[-3*4+20-0.5/-4.1]"; 

    //TODO: specify the delimiters: 
    // If you want more delimiters, e.g. (,), [, ] etc. 
    // for, say, 9*[(456+789)/(95-2.96)-3] 
    // just add them into the array 
    char[] delimiters = new char[] { '*', '+', '-', '/' }; 

    string pattern = "(" + string.Join("|", delimiters 
    .Select(item => Regex.Escape(item.ToString()))) + ")"; 

    string[] result = Regex 
    .Split(source.TrimStart('[').TrimEnd(']'), pattern) // (...) preserves delim 
    .Select(item => item.Trim()) // <- if you want to trim each item 
    .Where(item => !string.IsNullOrEmpty(item)) 
    .ToArray(); 

    // -, 3, *, 4, +, 20, -, 0.5, /, -, 4.1 
    Console.Write(string.Join(", ", result)); 

Modifier: Pour les grands textes que vous pouvez mettre en œuvre la scission manuellement:

public static List<string> SplitPreserveSeparators(string source, char[] delimiters) { 
    if (null == source) 
    throw new ArgumentNullException("source") 
    else if (delimiters == null) 
    throw new ArgumentNullException("delimiters") 

    int start = 0; 
    int index = -1; 

    List<string> items = new List<string>(); 

    while ((index = source.IndexOfAny(delimiters, start)) >= 0) { 
    string value = source.Substring(start, index - start); 

    if (!string.IsNullOrEmpty(value)) 
     items.Add(value); 

    items.Add(source.Substring(index, 1)); 
    start = index + 1; 
    } 

    if (start < source.Length) 
    items.Add(source.Substring(start)); 

    return items; 
} 

et utilisation il

string source = "[-3-4+20-0.5/-4.1]"; 
char[] delimiters = new char[] { '*', '+', '-', '/' }; 

List<string> result = SplitPreserveSeparators(
    source.TrimStart('[').TrimEnd(']'), 
    delimiters); 

Console.Write(string.Join(", ", result)); 
+0

Et penser à dire '[-1 + 2]' regex ne semble toujours pas cette bonne idée .. – Lanorkin

+0

@Lanorkin: Belle prise! Je vous remercie! Les chaînes vides doivent avoir été supprimées (j'ai modifié l'asnwer). En général, il n'y a pas d'alternative à un analyseur –

+0

L'exemple de la question est très mauvais et ne décrit qu'un cas très simple. Nous avons besoin d'un scénario très complexe ou même le pire pour offrir une réponse efficace. La question en cours peut être résolue en prenant le tableau char de la chaîne interne. –

0

Vous pouvez mettre en œuvre une méthode simple d'extension personnalisée pour le fractionnement avec des séparateurs stockés:

public static class StringExtensions 
{ 
    public static string[] SplitStoreSeparators(this string input, char[] separators) 
    { 
     List<string> tokens = new List<string>(); 

     StringBuilder sb = new StringBuilder(); 
     foreach (var c in input) 
     { 
      if (separators.Contains(c)) { 
       if (sb.Length > 0) { 
        tokens.Add(sb.ToString()); 
        sb.Clear(); 
       } 
       tokens.Add(c.ToString()); 
      } else { 
       sb.Append(c); 
      } 
     } 

     if (sb.Length > 0) 
      tokens.Add(sb.ToString()); 

     return tokens.ToArray(); 
    } 
} 

Utilisation:

string input = Console.ReadLine().TrimStart('[').TrimEnd(']'); 
string[] output = input.SplitStoreSeparators(new[] { '+', '-', '/', '*' }); 
+0

Et qu'en est-il de [10 + 20] '? .. – Lanorkin

+0

@Lanorkin J'étais trop myope à propos de ce problème. J'ai mis à jour ma réponse. –

+0

'string current =" "; ... current + = c; 'n'est pas un bon rôle pour' string' (surtout si vous avez un grand texte à analyser); 'StringBuilder current = ... current.Append (c);' –

0

Peut-être, cette chaîne et l'énumération stocker chaque élément dans un tableau de résultat, en sautant le premier et le dernier élément donnera le résultat que vous voulez.

-1

Une chaîne est un tableau de caractères. En tant que tel, vous pouvez utiliser la méthode String.ToCharArray() pour le stocker en tant que tableau. Pour supprimer le premier et le dernier caractère, nous pouvons transmettre un int pour l'index de départ et un int pour la longueur requise.

Par exemple:

string myString = "[3-4+6*2]"; 

char[] myArray = myString.ToCharArray(1, myString.Length-2); 

Cela supprimera les premiers et derniers caractères de la chaîne et de stocker chaque caractère restant dans un tableau.

+1

La question n'est pas de savoir comment stocker les délimiteurs. La question était sur la façon de stocker les délimiteurs et les caractères dans un tableau. Si vous avez supprimé votre commentaire, veuillez également supprimer votre vote négatif. – JMad

+0

Mais cela ne se divise pas sur les délimiteurs. Qu'en est-il de "[10 + 12]"? –